web-dev-qa-db-ja.com

int型のリテラルxyzが範囲外です

現在、Javaでデータ型を使用していますが、タイプlongが正しく理解していれば、-9,223,372,036,854から+9,223,372,036,854,775,807の範囲の値を受け入れます。以下に示すように、testLongというLong変数を作成していますが、値として9223372036854775807を挿入すると、次のエラーが表示されます。

「int型のリテラル9223372036854775807は範囲外です。」

longデータ型をintとして参照している理由がわかりません

誰にもアイデアはありますか?

以下のコード:

char testChar = 01;
byte testByte = -128;
int testInt = -2147483648;
short testShort = -32768;
long testLong = 9223372036854775807;
float testFoat;
double testDouble = 4.940656458412;
boolean testBool = true;
81
Mathew Donnan

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

long value = 9223372036854775807L;

そうでない場合、コンパイラはリテラルをintとして解析しようとするため、エラーメッセージ

187
Lukas Eder

なぜlongデータ型をintとして参照しているのかわかりません

そうではない。コンパイラメッセージを信頼することを学ぶ必要があります(特に、それらが古代のC/C++コンパイラではなく、健全な現代のコンパイラからのものである場合)。彼らが話す言語は時々解読するのが難しいかもしれませんが、彼らは通常あなたに嘘をついていません。

もう一度見てみましょう。

Int 9223372036854775807のリテラルは範囲外です。

それは、ではなく変数testLongまたはタイプlongに言及していないため、not初期化について。問題は、他のいくつかのポイントで発生するようです。

次に、メッセージの一部を調べてみましょう。

  • intは、何かをint値として扱うことを望んでいることを示します(これはあなたが望んだものではありません!)
  • 「範囲外」はかなり明確です:何かが予想範囲内にない(おそらくintの範囲内にある)
  • 「リテラル」:面白いですね。リテラルとは何ですか?

居心地の良いリストから離れて、リテラルについて少し話しましょう。リテラルとは、コードに何らかの価値がある場所です。 Stringリテラル、intリテラル、classリテラルなどがあります。コードでvalueを明示的に言及するたびに、それはリテラルです。

だから、実際には変数宣言についてあなたを悩ませているのではなく、数値自体、値があなたを悩ませているものです。

longintが等しく受け入れられるコンテキストで同じリテラルを使用すると、これを簡単に確認できます。

System.out.println(9223372036854775807);

PrintStream.printlnan int または a long (またはほとんど何でも)を取ることができますその他)。そのコードは問題ないはずですよね?

いいえ。まあ、多分それはshouldかもしれませんが、ルールによれば、それはisではありません。

問題は、 「いくつかの数字」がintリテラル として定義されているため、mustintで定義された範囲内であること。

longリテラルを記述したい場合は、L(または小文字のlを追加して明示的にする必要がありますが、Ihighly大文字のバリアントを常に使用することをお勧めします。これは、読みやすく、1)と間違えにくいためです。

float(後置F/f)およびdouble(後置D/d)でも同様の問題が発生することに注意してください。

サイドノート:byteまたはshortリテラルはなく、intおよびbyteに値(通常はshortリテラル)を割り当てることができることに気付くでしょう。変数: の特別な規則により可能です§割り当て変換についての5.2 :より大きい型の定数式をbyteshortに割り当てることができます。 charまたはintif値は型の範囲内です。

45
Joachim Sauer

9223372036854775807Lを試してください

13
jontro

私は過去にこの問題を抱えていましたが、科学的な形で価値を書くことでそれを修正しました。例えば:

double val = 9e300;
0
user7507137