JavaのL番号(ロング)仕様
-
12-09-2019 - |
質問
Java で数値を入力すると、コンパイラは自動的にそれを整数として読み取るようです。そのため、(long) を入力すると、 6000000000
(整数の範囲外です)次のように不平を言います 6000000000
は整数ではありません。これを修正するには、次のように指定する必要がありました 6000000000L
. 。この仕様については最近知りました。
short、byte、float、doubleなどの他の数値指定はありますか?入力している数値が短いと指定できれば、Java はそれをキャストする必要がなくなるため (私が推測している)、これらはあったほうが良いようです。これは仮定です。間違っていたら訂正してください。 。通常、この質問を自分で検索するのですが、この種の数値指定が何と呼ばれるかさえ知りません。
解決
long
に特異的な接尾辞(例えば39832L
)、float
(例えば2.4f
)とdouble
(例えば-7.832d
)があります。
がない接尾辞ではない、そしてそれが整数型である場合(例えば5623
)、int
であると仮定されます。それは整数型(例えば3.14159
)でない場合、double
と見なされます。
他のすべてのケース(byte
、short
、char
)では、あなたは、キャストを必要としています。
のJava仕様は、上下両方のケースサフィックスを可能にするが、上ケースlong
は小文字L
より数字1
と混同しにくくなるようl
sための大文字バージョンが、好ましい。
他のヒント
多少の余談は気にしないでいただければ幸いですが、それ以外にも知りたいことがあると思います F
(フロートの場合)、 D
(ダブルの場合)、および L
(長い間)、 提案がなされました 接尾辞を追加するには byte
そして short
—Y
そして S
それぞれ。これにより、バイト (または短い) 配列にリテラル構文を使用するときにバイトにキャストする必要がなくなります。提案書の例を引用すると、次のようになります。
主な利点:提案が採用されている場合、なぜプラットフォームが良いのですか?
みたいな汚いコード
byte[] stuff = { 0x00, 0x7F, (byte)0x80, (byte)0xFF};
次のように再コード化できます
byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy };
Joe Darcy は Java 7 用の Project Coin を監督しており、 彼のブログ これらの提案を追跡する簡単な方法があります。
これらはリテラルであり、次で説明されています。 セクション3.10 Java 言語仕様の。
デフォルトでは任意の整数プリミティブデータ型(バイト、ショート、int型、長い)は、Javaコンパイラによって、のint型の型として扱われます。 のバイトと短いのために、限り、それらに割り当てられた値がその範囲内にあるように、問題と接尾辞なし必要なしにはありません。値がに割り当てられている場合、のバイトと短いのは、彼らの範囲を超えて、明示的な型キャストが必要とされます。
例:
byte b = 130; // CE: range is exceeding.
これは型キャストを行う克服する。
byte b = (byte)130; //valid, but chances of losing data is there.
長いデータ・タイプの場合には、任意の手間をかけずに整数値を受け入れることができます。我々は次のように割り当てるとします。
Long l = 2147483647; //which is max value of int
この場合にはL / Lのような接尾辞が必要とされません。 Javaコンパイラによって考えられているデフォルト値2147483647によってint型です。内蔵型キャストがコンパイラとint型で行われているが、自動ロングタイプにプロモートされます。
Long l = 2147483648; //CE: value is treated as int but out of range
ここでは、Javaコンパイラによってリテラル2147483648としてlong型を治療するためのLと接尾辞を配置する必要があります。
ので、最後に
Long l = 2147483648L;// works fine.
リテラルの解析は、コンパイル時に起こるので、これらのに良いでしょうように思えます 持っているあなたができれば(私は仮定)ので、 あなたが入力している数が指定 短いその後、Javaはしていません それをキャスト
、これは、性能に関しては全く無関係です。いいだろうshort
とbyte
接尾辞を持つ唯一の理由は、それがよりコンパクトなコードにつながるということです。
考えてみます:
long l = -1 >>> 1;
対
int a = -1;
long l = a >>> 1;
これは、変数l
に同じ値を与えるために、コードの断片を気に期待したいです。だから我々はint
リテラルの表現がint
sとして実行する必要があります。