バイナリで
、0
ビットと、各タイプの開始のためのMAX_VALUE
秒すべて1
ビットで続行してください。
Integer.MAX_VALUE: 01111111111111111111111111111111
は、しかし、あなたがそれを生産していない:ということは、Integer.MAX_VALUE
を得るために、あなたは31個の1
ビットが続く0
ビットが必要になります。 Byte.MAX_VALUE
を4回繰り返して使用しています。これは、あなたがそうで7 1
ビットと続く0
ビットに続いて7つの1
ビットが続く0
ビット持っていることを意味:
Byte.MAX_VALUE: 01111111
Byte.MAX_VALUE×4: 01111111011111110111111101111111 (2,139,062,143)
-1
以来sが専ら1
ビットで構成されているが、あなたはあなたが欲しいものを得ることができます
Byte.MAX_VALUE: 01111111
-1: 11111111
Byte.MAX_VALUE, -1×3: 01111111111111111111111111111111
あなたがCOMBINしようとすると、第二の問題が発生します:3つの-1
Sに続く1 Byte.MAX_VALUE
これらのe。 Javaが負の値のbyte
をint
に変換すると、それは負の値int
になります。つまり、1
の全体が2進数で左側に追加されます。したがって、byte
から追加したビットを削除するには、& 0xff
(またはByte.toUnsignedInt
)を使用する必要があります。
+
の代わりに|
を使用する方が、より正確に何が起こっているのかがわかります。なぜあなたは `+`を使用している
byte a = Byte.MAX_VALUE;
byte b = -1;
byte c = -1;
byte d = -1;
System.out.println(((a & 0xff) << 24) | ((b & 0xff) << 16) | ((c & 0xff) << 8) | ((d & 0xff) << 0));
:
Integer.MAX_VALUE
を生成するので、、? – shmosel
0x7f7f7f7fを印刷しています。 – VGR
INT_MAXは2147483647と-2147483648ですが、0は1つの場所を取るためです – CSK