2017-03-02 25 views
-1

私はバイナリとメモリについて少し勉強していて、intがどのように書かれているか見ていましたが、基本的には4バイトを書きました。ここで4バイトの数字は127です。符号付き整数を4バイトから構築するか?

byte a = Byte.MAX_VALUE; 
    byte b = Byte.MAX_VALUE; 
    byte c = Byte.MAX_VALUE; 
    byte d = Byte.MAX_VALUE; 

    System.out.println((a << 24) + (b << 16) + (c << 8) + (d << 0)); 

そして、毎回バイト(8ビット)だけ左にシフトします。

しかし、最大数は2147483647ではなく2139062143となりますが、それはなぜですか?

+1

Integer.MAX_VALUEを生成するので、

、? – shmosel

+0

0x7f7f7f7fを印刷しています。 – VGR

+0

INT_MAXは2147483647と-2147483648ですが、0は1つの場所を取るためです – CSK

答えて

1
バイナリで

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が負の値のbyteintに変換すると、それは負の値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)); 
+0

入手しました。 -1&0xffは私に255を与えます、私は01111111111111111111111111111111を作成するために127,255,255,255が必要です。もし最初のビットが負であれば正の数を表します。私は正しい? – Jony

+0

しかし、私はそれを否定したいのですか? – Jony

+0

はい。どの負の値ですか? –

0

いいえ、MSBはゼロでなければならず、その他のビットはすべて1である必要があります。0x7FFFFFFF、符号付き32ビット整数の最大値は2's complementです。

0

byteは-128と127の間で署名されています。したがって-1は8です。

byteintのプロモーション後にシフト<<が行われるため、32の整数-1が得られます。

ので

int a = 0xFF; // Or 0b1111_1111 
int b = 0xFF; 
int c = 0xFF; 
int d = 0xFF; 

をするか、または実行します。

byte[] bytes = { (byte)-1, (byte)-1, (byte)-1, (byte)-1 }; 
int n = ByteBuffer.wrap(bytes).getInt(); 

すべてのものを一つのように得ることができます。

int n = -1; 
int n = ~0; // Ones complement 
+0

http://stackoverflow.com/questions/2840190/java-convert-4-bytes-to-int私はORとANDオペレーター、私は何か誤解していますか?値127の4バイトは符号付き整数の最大値2147483647を返します。 – Jony

+0

127はバイナリ0111_111、Byte.MAX_VALUEです。そうではありません。 '(b&0xFF)<< ...'のようにバイトをシフトすることができます(シフト演算によってintに拡張された符号)。 –

関連する問題