ワイドニング変換
日本語 | 拡大変換 |
英語 | widening conversion |
ふりがな | わいどにんぐへんかん |
フリガナ | ワイドニングヘンカン |
プリミティブ型の値をサイズの小さい方から大きい方へと変換すること。
「=演算子」による「代入変換」や、メソッドの引数に渡した際の「メソッド呼び出し変換」で自動的に行われる「暗黙的キャスト」のひとつ。
たとえばbyte型からlong型へ代入する場合のように、サイズの大きいプリミティブ型変数からサイズの小さいプリミティブ型変数へ値を代入する際には、データの変換が行われる。これは、サイズが異なるためそのままでは代入できないからである。
この変換を「ワイドニング変換」と言う。
変換の内容は、整数値としては「サイズが増えた部分に0を加える」という単純なものである。
ただし、ビット単位で見ると、複雑な変換を行っている。
int等の整数型の場合、左端のビットが符号ビットとなっており、また負の数は「2の補数」で表現されるため、サイズの変換を行う際にはこれらの情報が維持されるように変換される。
浮動小数点型の場合、floatとdoubleではビット単位の構造がだいぶ違うため、符号、指数部、仮数部毎に変換される。
整数型から浮動小数点型へ変換する場合、データの形式が全く異なるため、同じ値の浮動小数点型に変換される。
参照型変数の場合でも、一応「アップキャスト」をワイドニング変換と呼ぶ。ただし、アップキャストの方が一般的であるため、あまりこの用法では使用されない。
アップキャストでは参照値やインスタンスに「全く変化が起きない」ことを考えると、プリミティブ型のワイドニング変換とは別物と考えた方がいいだろう。
実際の所、アップキャストの例を挙げるまでもなく、あまり使用されない用語である。
ちなみに、逆に大きい型から小さい型へと変換することを「ナローイング変換」と呼ぶ。
「=演算子」による「代入変換」や、メソッドの引数に渡した際の「メソッド呼び出し変換」で自動的に行われる「暗黙的キャスト」のひとつ。
たとえばbyte型からlong型へ代入する場合のように、サイズの大きいプリミティブ型変数からサイズの小さいプリミティブ型変数へ値を代入する際には、データの変換が行われる。これは、サイズが異なるためそのままでは代入できないからである。
この変換を「ワイドニング変換」と言う。
変換の内容は、整数値としては「サイズが増えた部分に0を加える」という単純なものである。
ただし、ビット単位で見ると、複雑な変換を行っている。
int等の整数型の場合、左端のビットが符号ビットとなっており、また負の数は「2の補数」で表現されるため、サイズの変換を行う際にはこれらの情報が維持されるように変換される。
浮動小数点型の場合、floatとdoubleではビット単位の構造がだいぶ違うため、符号、指数部、仮数部毎に変換される。
整数型から浮動小数点型へ変換する場合、データの形式が全く異なるため、同じ値の浮動小数点型に変換される。
参照型変数の場合でも、一応「アップキャスト」をワイドニング変換と呼ぶ。ただし、アップキャストの方が一般的であるため、あまりこの用法では使用されない。
アップキャストでは参照値やインスタンスに「全く変化が起きない」ことを考えると、プリミティブ型のワイドニング変換とは別物と考えた方がいいだろう。
実際の所、アップキャストの例を挙げるまでもなく、あまり使用されない用語である。
ちなみに、逆に大きい型から小さい型へと変換することを「ナローイング変換」と呼ぶ。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// サイズの小さい型からから大きい型へと
// 「ワイドニング」します。
byte b = 10;
long l = b;
System.out.println( b );
// 10
// 同じく浮動小数点の場合。
float f = 2.0F;
double d = f;
System.out.println( d );
// 2.0
// float型とdouble型では、同じ浮動小数点とはいえ
// ビットでの構造はまったく異なります。
// つまり、=演算子が「double型に合うように変換した」
// というわけです。
// アップキャストも一応「ワイドニング変換」になります。
// 実際には変換されていませんが。
String string = new String( "あいうえお" );
Object object = string;
System.out.println( object );
// あいうえお
}
}
public class Sample
{
public static void main( String[] args )
{
// サイズの小さい型からから大きい型へと
// 「ワイドニング」します。
byte b = 10;
long l = b;
System.out.println( b );
// 10
// 同じく浮動小数点の場合。
float f = 2.0F;
double d = f;
System.out.println( d );
// 2.0
// float型とdouble型では、同じ浮動小数点とはいえ
// ビットでの構造はまったく異なります。
// つまり、=演算子が「double型に合うように変換した」
// というわけです。
// アップキャストも一応「ワイドニング変換」になります。
// 実際には変換されていませんが。
String string = new String( "あいうえお" );
Object object = string;
System.out.println( object );
// あいうえお
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // サイズの小さい型からから大きい型へと // 「ワイドニング」します。 byte b = 10; long l = b; System.out.println( b ); // 10 // 同じく浮動小数点の場合。 float f = 2.0F; double d = f; System.out.println( d ); // 2.0 // float型とdouble型では、同じ浮動小数点とはいえ // ビットでの構造はまったく異なります。 // つまり、=演算子が「double型に合うように変換した」 // というわけです。 // アップキャストも一応「ワイドニング変換」になります。 // 実際には変換されていませんが。 String string = new String( "あいうえお" ); Object object = string; System.out.println( object ); // あいうえお } }