次のように私はバイトを初期化:java - このバイトは例外を発生させないのはなぜですか?
byte b = (byte) 0b11110000000;
をバイトのサイズの8ビットであるので、私はこの数は上記のみ短いかに割り当て可能でなければならないので、それは、いくつかの例外またはエラーをスローすることを期待していました。まだそれは-124と評価された?それともこれはおそらく「正常な」行動ですか? (例外はスローされませんが、変数はオーバーフローします)?
次のように私はバイトを初期化:java - このバイトは例外を発生させないのはなぜですか?
byte b = (byte) 0b11110000000;
をバイトのサイズの8ビットであるので、私はこの数は上記のみ短いかに割り当て可能でなければならないので、それは、いくつかの例外またはエラーをスローすることを期待していました。まだそれは-124と評価された?それともこれはおそらく「正常な」行動ですか? (例外はスローされませんが、変数はオーバーフローします)?
あなたは-128
になるはずです。
int
をbyte
に明示的にキャストすると、下位8ビットが取り出され、残りは破棄されます。
例では、下位8ビットは10000000
であり、その数値の小数値は-128
です。
明示的キャストなしでは、割り当てによって情報が失われるため、コードはコンパイルに合格しません。ここで
:
byte b = (byte) 0b11110000000;
0b11110000000
はbyte
に変換狭めていることint
リテラルです。
バイトは8ビット符号付き2の補数の整数です。
その最小値は-128であり、その最大値は127
バイト表現の最大値が
1111111
そして
10000000
だから1 の最大値をオーバーフローである、それをバイトの最小値である次の値にオーバーフローします。-128
キャストしていることを覚えておいてください。
は(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);
エラーを表示するには、キャストを削除します。
byte b = 0b11110000000;
これは「互換性のない型:整数からバイトへの不可逆変換」をもたらすでしょう。
この値を(byte)
で明示的にキャストしているので、Javaコンパイラは自分が行っていることを知っていることを前提としています。
私はそれを拡大プリミティブ変換といいます。
5.1.2。プリミティブ型の
19具体的な変換が拡大原始的な変換と呼ばれているプリミティブ変換を広げること:詳細については、短い、int型、long、float、またはdouble
に
バイトを、あなたは、このリンクを参照してください可能性があります。 https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html
だから「正常」*の動作です。しかし、私は彼らがなぜこのように設計したのか、誰にも分かりません。 – Zabuza
@Zabuzaもし、あなたが 'int'の下位8ビットだけに興味があるならば、この明示的なキャストを使って' int'を 'byte'に割り当てることができます。 'float'の' double'の整数部分だけに興味がある場合と同様に、明示的に 'int'(または' long')にキャストして小数部分を破棄することができます。 – Eran
ああ、比較して意味があるように聞こえる。 – Zabuza