web-dev-qa-db-ja.com

バイトb =(バイト)0xFFが整数-1と等しいのはなぜですか?

byte b = (byte) 0xFFinteger-1と等しいのはなぜですか?

例:

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

-1

22
okami

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

20
cletus
  1. _system.out.println_のどのオーバーロードを呼び出すかを決定する際に、bintに昇格されます。

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

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

13
jason

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

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

符号付き整数を使用している場合、2の補数のため、0xFF = -1です。

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

3
James Black

Java(およびほとんどの言語)は two's-complement math を使用して負の整数値を表すので、2の補数では、0xFF(11111111)は(signed int)で値-1。

1