数値格上げ変換
日本語 | 数値格上げ変換 |
英語 | numeric promotion |
ふりがな | すうちかくあげへんかん |
フリガナ | スウチカクアゲヘンカン |
演算子のオペランドにbyte型、short型、char型の変数や値を渡すと、int型に自動的にキャストされること。
以下の演算子の使用時に行われる。
・単項+演算子
・単項-演算子
・~演算子
・<<演算子
・>>演算子
・>>>演算子
・[]演算子
・+演算子
・-演算子
・*演算子
・/演算子
・%演算子
・<演算子
・<=演算子
・>演算子
・>=演算子
・==演算子
・!=演算子
・&演算子
・^演算子
・|演算子
・?演算子(三項演算子)
これらの演算子は、演算子のオペランドがbyte型、short型、char型のいずれかの場合、int型にキャストされてから使用される。また、計算結果を返す演算子の場合、その型もint型となる。
たとえば「byte bt = 1;」と変数宣言されている場合、「byte bt2 = -bt;」はコンパイルエラーとなる。これはbyte型変数の「bt」に単項-演算子「-」を使用した際に数値格上げ変換が行われ、返される値の型がint型になり、byte型変数に格納できないためである。この場合、「int i = -bt;」のようにint型で受け取らなければならない。
int型とlong型の場合には行われない。long型がint型に格下げ変換されたりはしない。
また、オペランドの型と返される型が関係ない演算子([]演算子や比較演算子)の場合には問題とならない。
数値格上げ変換により、byte型、short型、char型の演算は大きく制限されることになる。
これらの型を用いて演算を行う場合には、まずint型にキャストしてから行うといいだろう。
以下の演算子の使用時に行われる。
・単項+演算子
・単項-演算子
・~演算子
・<<演算子
・>>演算子
・>>>演算子
・[]演算子
・+演算子
・-演算子
・*演算子
・/演算子
・%演算子
・<演算子
・<=演算子
・>演算子
・>=演算子
・==演算子
・!=演算子
・&演算子
・^演算子
・|演算子
・?演算子(三項演算子)
これらの演算子は、演算子のオペランドがbyte型、short型、char型のいずれかの場合、int型にキャストされてから使用される。また、計算結果を返す演算子の場合、その型もint型となる。
たとえば「byte bt = 1;」と変数宣言されている場合、「byte bt2 = -bt;」はコンパイルエラーとなる。これはbyte型変数の「bt」に単項-演算子「-」を使用した際に数値格上げ変換が行われ、返される値の型がint型になり、byte型変数に格納できないためである。この場合、「int i = -bt;」のようにint型で受け取らなければならない。
int型とlong型の場合には行われない。long型がint型に格下げ変換されたりはしない。
また、オペランドの型と返される型が関係ない演算子([]演算子や比較演算子)の場合には問題とならない。
数値格上げ変換により、byte型、short型、char型の演算は大きく制限されることになる。
これらの型を用いて演算を行う場合には、まずint型にキャストしてから行うといいだろう。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
byte bt = 1;
// 単項-演算子は「数値格上げ変換」を行うため
// 返される値の型はint型になります。
// ※コンパイルエラーの例
// byte bt2 = -bt;
// ※エラーメッセージ
// 型の不一致: int から byte には変換できません
// ※コンパイルエラーの例ここまで
// int型で受け取れば問題ありません。
int i = -bt;
System.out.println( i );
// -1
// 数値格上げ変換ではbyte型、short型、char型が
// int型に変換されます。int型とlong型はそのままです。
long l = 2;
long l2 = -l;
System.out.println( l2 );
// -2
// 数値格上げ変換は多くの演算子で行われます。
// たとえば二項演算子の+演算子でも行われます。
short shLh = 3;
short shRh = 4;
// ※コンパイルエラーの例
// short sh = shLh + shRh;
// ※エラーメッセージ
// 型の不一致: int から short には変換できません
// ※コンパイルエラーの例ここまで
// int型で受け取れば問題ありません。
int i2 = shLh + shRh;
System.out.println( i2 );
// 7
}
}
public class Sample
{
public static void main( String[] args )
{
byte bt = 1;
// 単項-演算子は「数値格上げ変換」を行うため
// 返される値の型はint型になります。
// ※コンパイルエラーの例
// byte bt2 = -bt;
// ※エラーメッセージ
// 型の不一致: int から byte には変換できません
// ※コンパイルエラーの例ここまで
// int型で受け取れば問題ありません。
int i = -bt;
System.out.println( i );
// -1
// 数値格上げ変換ではbyte型、short型、char型が
// int型に変換されます。int型とlong型はそのままです。
long l = 2;
long l2 = -l;
System.out.println( l2 );
// -2
// 数値格上げ変換は多くの演算子で行われます。
// たとえば二項演算子の+演算子でも行われます。
short shLh = 3;
short shRh = 4;
// ※コンパイルエラーの例
// short sh = shLh + shRh;
// ※エラーメッセージ
// 型の不一致: int から short には変換できません
// ※コンパイルエラーの例ここまで
// int型で受け取れば問題ありません。
int i2 = shLh + shRh;
System.out.println( i2 );
// 7
}
}
// Sample.java public class Sample { public static void main( String[] args ) { byte bt = 1; // 単項-演算子は「数値格上げ変換」を行うため // 返される値の型はint型になります。 // ※コンパイルエラーの例 // byte bt2 = -bt; // ※エラーメッセージ // 型の不一致: int から byte には変換できません // ※コンパイルエラーの例ここまで // int型で受け取れば問題ありません。 int i = -bt; System.out.println( i ); // -1 // 数値格上げ変換ではbyte型、short型、char型が // int型に変換されます。int型とlong型はそのままです。 long l = 2; long l2 = -l; System.out.println( l2 ); // -2 // 数値格上げ変換は多くの演算子で行われます。 // たとえば二項演算子の+演算子でも行われます。 short shLh = 3; short shRh = 4; // ※コンパイルエラーの例 // short sh = shLh + shRh; // ※エラーメッセージ // 型の不一致: int から short には変換できません // ※コンパイルエラーの例ここまで // int型で受け取れば問題ありません。 int i2 = shLh + shRh; System.out.println( i2 ); // 7 } }