web-dev-qa-db-ja.com

なぜ「int i = 2147483647 + 1;」なのかOK、しかし「バイトb = 127 + 1;」コンパイルできませんか?

なぜint i = 2147483647 + 1; OK、ただしbyte b = 127 + 1;はコンパイルできませんか?

126
goku

定数はintとして評価されるため、_2147483647 + 1_はオーバーフローしてintに割り当て可能な新しいintを提供しますが、_127 + 1_もintは_128_、およびbyteに割り当てることはできません。

172
MByD

リテラル127は、int型の値を示します。リテラル1もそうです。これら2つの合計は整数128です。2番目の場合の問題は、これをバイト型の変数に割り当てることです。式の実際の値とは関係ありません。 Java非強制型変換(*)に関係しています。型キャストを追加する必要があります

byte b = (byte)(127 + 1);

そしてコンパイルします。

(*)少なくともString-to-integer、float-to-Time、... Javaは、ある意味で非損失(Javaこれを「拡大」と呼びます)。

いいえ、「強制」という言葉は修正する必要がありませんでした。それは非常に故意にそして正しく選ばれました。手元に最も近い情報源から(Wikipedia):「ほとんどの言語では、Word強制は 暗黙 コンパイル時または実行時のいずれかの変換。」および「コンピュータサイエンスでは、型変換、型キャスト、および強制はdifferentです。 =暗黙的または明示的に、1つのデータ型のエンティティを別のデータ型に変更する方法。」.

35
Erwin Smout

@MByDへの証拠として:

次のコードはコンパイルします。

byte c = (byte)(127 + 1);

なぜなら式(127 + 1)はintであり、スコープ[byte typeを超えています]結果はbyteにキャストされます。この式は-128

6
AlexR

JLS3#5.2割り当て変換

(変数=式)

さらに、式がbyte、short、char、またはint型の定数式(§15.28)の場合:

変数の型がバイト、ショート、または文字であり、定数式の値が変数の型で表現できる場合、ナローイングプリミティブ変換を使用できます。


この句がないと、次のように書くことができません。

byte x = 0;
char c = 0;

しかし、これを行うことができるでしょうか?私はそうは思いません。プリミティブ間の変換にはかなりの魔法があり、非常に注意が必要です。私は書くために邪魔になりました

byte x = (byte)0;
3
irreputable