なぜint i = 2147483647 + 1;
OK、ただしbyte b = 127 + 1;
はコンパイルできませんか?
定数はintとして評価されるため、_2147483647 + 1
_はオーバーフローしてint
に割り当て可能な新しいintを提供しますが、_127 + 1
_もint
は_128
_、およびbyte
に割り当てることはできません。
リテラル127は、int型の値を示します。リテラル1もそうです。これら2つの合計は整数128です。2番目の場合の問題は、これをバイト型の変数に割り当てることです。式の実際の値とは関係ありません。 Java非強制型変換(*)に関係しています。型キャストを追加する必要があります
byte b = (byte)(127 + 1);
そしてコンパイルします。
(*)少なくともString-to-integer、float-to-Time、... Javaは、ある意味で非損失(Javaこれを「拡大」と呼びます)。
いいえ、「強制」という言葉は修正する必要がありませんでした。それは非常に故意にそして正しく選ばれました。手元に最も近い情報源から(Wikipedia):「ほとんどの言語では、Word強制は 暗黙 コンパイル時または実行時のいずれかの変換。」および「コンピュータサイエンスでは、型変換、型キャスト、および強制はdifferentです。 =暗黙的または明示的に、1つのデータ型のエンティティを別のデータ型に変更する方法。」.
@MByDへの証拠として:
次のコードはコンパイルします。
byte c = (byte)(127 + 1);
なぜなら式(127 + 1)
はintであり、スコープ[byte
typeを超えています]結果はbyte
にキャストされます。この式は-128
。
JLS3#5.2割り当て変換
(変数=式)
さらに、式がbyte、short、char、またはint型の定数式(§15.28)の場合:
変数の型がバイト、ショート、または文字であり、定数式の値が変数の型で表現できる場合、ナローイングプリミティブ変換を使用できます。
この句がないと、次のように書くことができません。
byte x = 0;
char c = 0;
しかし、これを行うことができるでしょうか?私はそうは思いません。プリミティブ間の変換にはかなりの魔法があり、非常に注意が必要です。私は書くために邪魔になりました
byte x = (byte)0;