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の補数 を参照してください。
_system.out.println
_のどのオーバーロードを呼び出すかを決定する際に、b
はint
に昇格されます。
Javaのすべてのバイトは署名されています。
符号付きバイト_0xff
_は、値_-1
_を表します。これは、Javaは 2の補数 を使用して符号付きの値を表すためです。符号付きバイト_0xff
_は_-1
_を表します。これは、最上位ビットが_1
_(したがって、負の値を表します)であり、その値は_-128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1
_です。
おそらくあなたの混乱は、なぜ(byte)0xFF
が(int)0xFFFFFFFF
に等しいのかに起因します。ここで起こっていることは、小さい符号型から大きい符号型への昇格により、小さい値がsign extendedになり、最上位ビットが昇格された値のすべての新しいビットにコピーされます。符号なしの型は符号拡張されません。ゼロ拡張され、新しいビットは常にゼロになります。
それを飲み込むのに役立つ場合は、このように考えてください。どのサイズのすべての整数にも、表現するには意味が大きすぎる「ファントム」ビットがあります。それらは存在し、変数に格納されません。負の数はこれらのビットがゼロ以外であり、正の数は小さい値を大きい値にプロモートすると、ファントムビットのすべてがゼロになり、これらのファントムビットは実数ビットになります。
符号付き整数を使用している場合、2の補数のため、0xFF = -1です。
このウィキの記事はそれをうまく説明しています。右側の表を参照してください: http://en.wikipedia.org/wiki/Two%27s_complement
Java(およびほとんどの言語)は two's-complement math を使用して負の整数値を表すので、2の補数では、0xFF(11111111)は(signed int)で値-1。