byte b = (byte) 0xFF
が に等しいのはなぜinteger
-1
ですか?
元:
int value = byte b = (byte) 0xFF;
System.out.println(value);
それは印刷されます-1
か?
byte b = (byte) 0xFF
が に等しいのはなぜinteger
-1
ですか?
元:
int value = byte b = (byte) 0xFF;
System.out.println(value);
それは印刷されます-1
か?
バイトは Java で署名されます。バイナリでは、0x00 は 0、0x01 は 1 などですが、すべての 1 (つまり 0xFF) は -1、0xFE は -2 などです。使用されるバイナリ エンコーディング メカニズムである2 の補数を参照してください。
b
のどのオーバーロードを呼び出すint
かを決定する際に、 に昇格されます。system.out.println
Java のすべてのバイトは署名されています。
符号付きバイト0xff
は値を表します-1
。これは、Java が2 の補数を使用して符号付きの値を表すためです。符号付きバイト0xff
は-1
、その最上位ビットが で1
あるため (つまり、負の値を表す)、その値が であるため、 を表します-128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1
。
おそらくあなたの混乱は、なぜ(byte)0xFF
が何らかの形で に等しいかから来ています(int)0xFFFFFFFF
。ここで起こっているのは、小さい符号付き型から大きい符号付き型への昇格により、小さい値が符号拡張され、昇格された値の新しいビットすべてに最上位ビットがコピーされることです。符号なしの型は符号拡張されず、ゼロ拡張され、新しいビットは常にゼロになります。
飲み込むのに役立つ場合は、次のように考えてください。任意のサイズのすべての整数には、表現するには重要すぎる「ファントム」ビットもあります。それらはそこにありますが、変数に保存されていません。負の数はゼロ以外のビットを持ち、正の数はファントム ビットがすべてゼロで、小さい値を大きな値にプロモートすると、それらのファントム ビットは実数になります。
signed int を使用している場合、2 の補数により 0xFF = -1 になります。
この wiki 記事はそれをよく説明しています。右の表を参照してください: http://en.wikipedia.org/wiki/Two%27s_complement
Java (およびほとんどの言語) は、 2 の補数演算を使用して負の整数値を表すためです。2 の補数では、0xFF (11111111) は (signed int で) 値 -1 を表します。
減法モジュロ
バイト = 256 0xff = 255
255 / 256 -> 残り 255
したがって、255 - 256 = -1
単純な論理の乾杯
2 の補数演算を行うのは Java だけではありません。これは、私が思いつくすべてのマイクロプロセッサと DSP が計算を行う方法です。したがって、すべてのプログラミング言語がそれを表す方法です。