web-dev-qa-db-ja.com

40億という「長い」値を割り当てることができないのはなぜですか?

Javaで長い値を宣言しようとしていますが、残念ながら機能しません。

これは私のコードです。次のエラーメッセージが表示されます。「int型のリテラル4294967296は範囲外です」。

_long bytes = 4294967296;
_

4294967296バイト(4GB)よりも大きいファイルを除外するファイルフィルターを作成するには、この値が必要です。他の方法は問題なく動作します(long size = file.length())。すべてのファイルサイズで、宣言が機能しない理由がわかりません。

34
Peter

Lを数字の末尾に追加します。

long bytes = 4294967296L;
74
icktoofay

質問のタイトルに回答するには、定数を介してlongの最大値を取得できます。

Long.MAX_VALUE

問題を解決するには、番号の後にlL)リテラルを追加します。

28
Bozho

longリテラルの後には、文字Lまたはlが続きます( JLS 3.10.1 を参照)。大文字の方が読みやすいため、小文字のl1に似すぎます。

特定の番号については、おそらく次のように書く方が簡単です。

 long bytes = (1L << 32);

このようにして、コードを読んだ人は、bytesがちょうど2の32乗であることをすぐに知ることができます。

19

試してくださいlong bytes = 4294967296L;は、longを使用していることをコンパイラーに示します。

18
Soufiane Hassou

「なぜ」という質問に対する答えは、4294967296によるものです。デフォルトでは、Java intまたはdouble型(ドットの有無に応じて)として任意の数値を調べます。その後、この数値を指定した型に変換します(長い場合))したがって、表示されるエラーは、数値が最大値fot intよりも大きいことを意味します。末尾にリテラル属性を追加すると、compillerに使用するタイプ(b-バイト、s-ショート、l-ロング、f-フロート)が通知されます

4
user1660016

ソフィアンは正しいです。 Javaでさまざまなタイプの数値のリテラルを宣言する方法を示すドキュメントを次に示します。

http://www.janeg.ca/scjp/lang/literals.html

2
Doug Porter