web-dev-qa-db-ja.com

JavaのL番号(長い)仕様

Javaで数値を入力すると、コンパイラは自動的に整数として読み取ります。このため、(長い)6000000000(整数の範囲ではない)を入力すると、6000000000は整数ではありません。これを修正するには、6000000000Lを指定する必要がありました。この仕様について知りました。

Short、byte、float、doubleなどの他の数値指定はありますか?入力している番号を短く指定できれば、Javaはキャストする必要がないので、これらは正しいと思われます。私が間違っていたら私は通常、この質問を自分で検索しますが、この種の数値仕様が何と呼ばれているのかわかりません。

89
jbu

longには特定のサフィックスがあります(例:39832L)、float(例:2.4f)およびdouble(例:-7.832d)。

接尾辞がなく、整数型である場合(例:5623)、intと見なされます。整数型でない場合(例:3.14159)、doubleと見なされます。

他のすべての場合(byteshortchar)では、特定のサフィックスがないためキャストが必要です。

Java仕様では大文字と小文字の両方の接尾辞を使用できますが、大文字のlongは混乱しにくいため、Lsの大文字バージョンが推奨されます数字1小文字のlより。

詳細な情報については JLSセクション3.1 をご覧ください(IntegerTypeSuffixの定義をご覧ください)。

164
Simon Nickerson

少しの接線を気にしないことを願っていますが、F(フロートの場合)、D(ダブルの場合)、およびL以外にも興味があるかもしれません。 (長い間)、 提案が行われましたbyteshortYSにそれぞれ接尾辞を追加します。これにより、バイト(または短い)配列にリテラル構文を使用するときに、バイトにキャストする必要がなくなります。提案から例を引用する:

主な利点:提案が採用された場合、なぜプラットフォームが優れているのですか?

のような汚いコード

 byte[] stuff = { 0x00, 0x7F, (byte)0x80,  (byte)0xFF};

として再コーディングすることができます

 byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy };

Joe DarcyはJava 7のProject Coinを監督しており、 his blog はこれらの提案を追跡する簡単な方法です。

13
erickson

デフォルトでは、整数プリミティブデータ型(byte、short、int、long)は、Javaによってint型として扱われます。 =コンパイラ。byteおよびshortの場合、値が割り当てられている限りbyteおよびshortが範囲を超えているため、明示的な型キャストが必要です。

例:

byte b = 130; // CE: range is exceeding.

これを克服するには、型キャストを実行します。

byte b = (byte)130; //valid, but chances of losing data is there.

Longデータ型の場合、手間をかけずに整数値を受け入れることができます。のように割り当てるとします

Long l = 2147483647; //which is max value of int

この場合、L/lのようなサフィックスは必要ありません。デフォルトでは、値2147483647はJavaコンパイラはint型です。内部型のキャストはコンパイラによって行われ、intはLong型に自動昇格されます。

Long l = 2147483648; //CE: value is treated as int but out of range 

ここでは、Javaコンパイラーによってリテラル2147483648をlong型として扱うために、接尾部をLとして置く必要があります。

だからついに

Long l = 2147483648L;// works fine.
8
Utpal Kumar

これらはリテラルであり、Java言語仕様の section 3.1 で説明されています。

8
McDowell

入力している数字を短く指定できれば、Javaはキャストする必要がないので、これらは良いと思われます。

リテラルの解析はコンパイル時に発生するため、これはパフォーマンスに関してまったく無関係です。 shortおよびbyte接尾辞を持つ唯一の理由は、コードがよりコンパクトになるためです。

1

考慮してください:

long l = -1 >>> 1;

versus

int a = -1;
long l = a >>> 1;

これで、わずらわしいコードフラグメントが変数lに同じ値を与えると期待できます。したがって、intリテラルの式はintsとして実行する必要があります。