3

これは私のコードです:

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ですか?

4

6 に答える 6

9

a*b一時的なint変数、つまり 1111 1110 である 254 になるためです。バイトにキャストすると、これは符号付きの値として処理されます。MSB は 1 なので、値は負になり、値は -(((inv)111 1110) + 1) = -((000 0001) + 1) = -2 になります。

于 2013-11-05T09:46:13.950 に答える
3

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です。

于 2013-11-05T09:46:38.783 に答える
0

8 ビットの 127 は、次のように 2 進数で表されます。

01111111

2 を掛けると、次のようになります。

11111110

(基数 10 で 10 を掛けると、すべての桁を左にシフトして次の位置に移動できます。2 進数で 2 を掛けるときも当然同じです)

Java は 2 の補数を使用して負の数を表します。基本的に、一番左のビットは符号ビット (+ の場合は 0、- の場合は 1) です。正の数を負の数に変換するには、すべてのビットを反転して 1 を追加します。

例: 00000010= 2、ビットを反転: 11111101、次に 1 を追加: 11111110= -2。これは上記の 127*2 と同じです。

于 2013-11-05T09:51:23.237 に答える