2017-08-16 6 views
3

次のように私はバイトを初期化:java - このバイトは例外を発生させないのはなぜですか?

byte b = (byte) 0b11110000000; 

をバイトのサイズの8ビットであるので、私はこの数は上記のみ短いかに割り当て可能でなければならないので、それは、いくつかの例外またはエラーをスローすることを期待していました。まだそれは-124と評価された?それともこれはおそらく「正常な」行動ですか? (例外はスローされませんが、変数はオーバーフローします)?

答えて

6

あなたは-128になるはずです。

intbyteに明示的にキャストすると、下位8ビットが取り出され、残りは破棄されます。

例では、下位8ビットは10000000であり、その数値の小数値は-128です。

明示的キャストなしでは、割り当てによって情報が失われるため、コードはコンパイルに合格しません。ここで

+0

だから「正常」*の動作です。しかし、私は彼らがなぜこのように設計したのか、誰にも分かりません。 – Zabuza

+0

@Zabuzaもし、あなたが 'int'の下位8ビットだけに興味があるならば、この明示的なキャストを使って' int'を 'byte'に割り当てることができます。 'float'の' double'の整数部分だけに興味がある場合と同様に、明示的に 'int'(または' long')にキャストして小数部分を破棄することができます。 – Eran

+0

ああ、比較して意味があるように聞こえる。 – Zabuza

0

byte b = (byte) 0b11110000000; 

0b11110000000byteに変換狭めていることintリテラルです。

バイトは8ビット符号付き2の補数の整数です。
その最小値は-128であり、その最大値は127
バイト表現の最大値が

1111111 

そして

10000000 

だから1 の最大値をオーバーフローである、それをバイトの最小値である次の値にオーバーフローします。-128

0

キャストしていることを覚えておいてください。

(byte) 0b11110000000; 

他のすべて後のビット8が破棄されます(MSB)...

意味

:次のバイトの初期化は、-128(1000_0000または第一8ビット)にtrucatedされますalll

byte b = (byte) 0b1000_0000; 
System.out.println(b); 

b = (byte) 0b1111_1000_0000; 
System.out.println(b); 

b = (byte) 0b1111_1111_1000_0000; 
System.out.println(b); 

b = (byte) 0b1111_1111_1111_1000_0000; 
System.out.println(b); 

b = (byte) 0b1111_1111_1111_1111_1000_0000; 
System.out.println(b); 

b = (byte) 0b1111_1111_1111_1111_1111_1000_0000; 
System.out.println(b); 

b = (byte) 0b1111_1111_1111_1111_1111_1111_1000_0000; 
System.out.println(b); 

// even here with longs as bin 
b = (byte) 0b1111_1111_1111_1111_1111_1111_1111_1000_0000L; 
System.out.println(b); 
1

エラーを表示するには、キャストを削除します。

byte b = 0b11110000000; 

これは「互換性のない型:整数からバイトへの不可逆変換」をもたらすでしょう。

この値を(byte)で明示的にキャストしているので、Javaコンパイラは自分が行っていることを知っていることを前提としています。

0

私はそれを拡大プリミティブ変換といいます。

5.1.2。プリミティブ型の

19具体的な変換が拡大原始的な変換と呼ばれているプリミティブ変換を広げること:詳細については、短い、int型、long、float、またはdouble

バイトを、あなたは、このリンクを参照してください可能性があります。 https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

関連する問題