これは私のコードです:
public class test {
public static void main(String[] args) {
byte a=(byte)127, b=2;
byte c=(byte)(a*b);
System.out.println(c);
}
}
結果はなぜ-2
ですか?
これは私のコードです:
public class test {
public static void main(String[] args) {
byte a=(byte)127, b=2;
byte c=(byte)(a*b);
System.out.println(c);
}
}
結果はなぜ-2
ですか?
a*b
一時的なint変数、つまり 1111 1110 である 254 になるためです。バイトにキャストすると、これは符号付きの値として処理されます。MSB は 1 なので、値は負になり、値は -(((inv)111 1110) + 1) = -((000 0001) + 1) = -2 になります。
a * b
は 254 なので、コードは次のとおりです。
byte c=(byte)254;
10 進数の 254 は 2 進数の11111110で、-2 です。なんで?
まず、数値は 1 (2 の補数) で始まるため、負の数値です。次に、次のようにします。
¬ 1 1 1 1 1 1 1 0
です0 0 0 0 0 0 0 1
。
0 0 0 0 0 0 0 1
1 +
---------------
0 0 0 0 0 0 1 0
これは 10 進数で 2 を表しますが、 MSBが 1であることを覚えていますか? したがって、最終結果は-2です。
8 ビットの 127 は、次のように 2 進数で表されます。
01111111
2 を掛けると、次のようになります。
11111110
(基数 10 で 10 を掛けると、すべての桁を左にシフトして次の位置に移動できます。2 進数で 2 を掛けるときも当然同じです)
Java は 2 の補数を使用して負の数を表します。基本的に、一番左のビットは符号ビット (+ の場合は 0、- の場合は 1) です。正の数を負の数に変換するには、すべてのビットを反転して 1 を追加します。
例: 00000010
= 2、ビットを反転: 11111101
、次に 1 を追加: 11111110
= -2。これは上記の 127*2 と同じです。