23

byte b = (byte) 0xFFが に等しいのはなぜinteger -1ですか?

元:

int value = byte b = (byte) 0xFF;
System.out.println(value);

それは印刷されます-1か?

4

7 に答える 7

22

バイトは Java で署名されます。バイナリでは、0x00 は 0、0x01 は 1 などですが、すべての 1 (つまり 0xFF) は -1、0xFE は -2 などです。使用されるバイナリ エンコーディング メカニズムである2 の補数を参照してください。

于 2009-11-05T02:30:40.620 に答える
13
  1. bのどのオーバーロードを呼び出すintかを決定する際に、 に昇格されます。system.out.println

  2. Java のすべてのバイトは署名されています。

  3. 符号付きバイト0xffは値を表します-1。これは、Java が2 の補数を使用して符号付きの値を表すためです。符号付きバイト0xff-1、その最上位ビットが で1あるため (つまり、負の値を表す)、その値が であるため、 を表します-128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1

于 2009-11-05T02:45:52.450 に答える
5

おそらくあなたの混乱は、なぜ(byte)0xFFが何らかの形で に等しいかから来ています(int)0xFFFFFFFF。ここで起こっているのは、小さい符号付き型から大きい符号付き型への昇格により、小さい値が符号拡張され、昇格された値の新しいビットすべてに最上位ビットがコピーされることです。符号なしの型は符号拡張されず、ゼロ拡張され、新しいビットは常にゼロになります。

飲み込むのに役立つ場合は、次のように考えてください。任意のサイズのすべての整数には、表現するには重要すぎる「ファントム」ビットもあります。それらはそこにありますが、変数に保存されていません。負の数はゼロ以外のビットを持ち、正の数はファントム ビットがすべてゼロで、小さい値を大きな値にプロモートすると、それらのファントム ビットは実数になります。

于 2009-11-05T02:55:07.920 に答える
3

signed int を使用している場合、2 の補数により 0xFF = -1 になります。

この wiki 記事はそれをよく説明しています。右の表を参照してください: http://en.wikipedia.org/wiki/Two%27s_complement

于 2009-11-05T02:29:49.827 に答える
1

Java (およびほとんどの言語) は、 2 の補数演算を使用して負の整数値を表すためです。2 の補数では、0xFF (11111111) は (signed int で) 値 -1 を表します。

于 2009-11-05T02:30:37.080 に答える
0

減法モジュロ

バイト = 256 0xff = 255

255 / 256 -> 残り 255

したがって、255 - 256 = -1

単純な論理の乾杯

于 2012-05-08T04:54:10.403 に答える
-1

2 の補数演算を行うのは Java だけではありません。これは、私が思いつくすべてのマイクロプロセッサと DSP が計算を行う方法です。したがって、すべてのプログラミング言語がそれを表す方法です。

于 2009-11-05T02:54:48.577 に答える