intタイプ128からbyteタイプに変換した後、なぜ-128ですか?

2026 ワード

まずコードを見てください。

public class Test {

	public static void main(String[] args) {
           int a = 128;
           byte b = (byte)a;
           System.out.println("a:"+a);
           System.out.println("b:"+b);

           }
}
出力結果は:
a:128
b:-128
これはなぜですか?
intの長さは32 bitなので、intの中で128のバイナリは0000 0000 0000 0000 000 000 javaと表しています。強転時に、長ビット転短位であれば短いビットと同じ長ビット末尾のバイナリ値を保持します。例えば、int 32ビット転byte 8ビットの場合は、int 32ビット中の最後の8ビットだけを保持します。上記のコード:int a=128;byte b=(byte)aコードのaのバイナリ値は0000 0000 0000 0000 000 000,000で、強制的にbyteタイプに変換した場合、そのバイナリ値は1000 0000(int 32ビットの末尾8ビットを保持しています)です。byteは8ビットしかないので、したがって、int 32ビットのうち、前の24個の0を全部外しました。byteタイプの中では、バイナリ1000 0000で表される10進数値は-128なので、上のコード出力の結果は、a:128です。 b:-128
ある学生が聞きましたが、どうしてbyteの中で1000 0000は-128ですか?
答:コンピュータの中で数字のバイナリは一番高い位置は符号ビットで、1はマイナス値、0は正の値を表します。       あなたはまた、その1000 0000は-0ではないかと聞きますか?トップが1なので、現在の値はマイナスです。        もし1000 0000が-0で、次に0000が0なら、2つの0が現れて、ビットの空間を浪費します。        したがって、符号ビットは1だけではなく、バイナリの加减操作を容易にするために、負の値のバイナリの原コードを逆符号化し、再コードする必要があります。        コンピュータの負の値は、バイナリは記号のビット以外に、原コードを逆にしてから補数を行います。        例えば、byteの-1は、このように表現すべきである。        -1の原コードは1000 0001です          -1の逆コード1111 1110(符号ビット不変)        -1の補填コード1111 1111(反符号プラス1)         ですから、byteの-1はコンピュータにおける表現形式は1111です。                   byteの中の1000 0000は-128のためにどのように計算されていますか?多くの資料を調べましたが、よく分かりませんでした。         計算は分かりませんが、この結果も推測できます。         -125は  1000 0011         -126は1000 0010です           -127は  1000 0001         -128は  1000 0000                 結論:
  •  マイナスのトップは間違いなく1
  • です。
  •  補数形式では、バイナリ記号の下位の値が小さいほど、10進数の値が小さいです。  ,ソースとは反対です       
  •           例えば:1000 0001ソースは-1です。   補数は-127です                  1111のソースコードは-127です。   補数は-1です
         この結論の第二条はどういう意味ですか?
         ほら、これは1000 0001のトップマークを抜きます。後の値は000 0001です。
        次に1111は、最初のシンボルビット1を削除し、後の値は111 1111であり、
       000 0001と111 1111は特に小さいですよね。だから、それに対応する十進数も特に-127より小さいです。111 1111は特に大きいですか?それは対応しています。
      10進数の値は-1、-1と-127の比率は-1より大きいです。したがって、補数形式では、バイナリシンボルビットの後の値が小さいほど、10進数の値が小さいです。