タイプintのリテラルxyzは範囲外です


89

私は現在Javaでデータ型longを扱っています。正しく理解していれば、その型は-9,223,372,036,854,775,808から+9,223,372,036,854,775,807の範囲の値を受け入れます。下記のように、というlong変数を作成しましたがtestLong、値として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;

ちなみに、どのコンパイラを使用していますか?EclipseとSun JDKコンパイラはどちらも、この問題に対して異なる(私の意見ではより良い)エラーメッセージを表示します。
Joachim Sauer

回答:


195

L最後に大文字を追加します。

long value = 9223372036854775807L;

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


4
それはJava言語仕様にあります。ここで
Lukas Eder

@Lukas、長い値= 00000077029062100L; 同じエラーが表示され、19桁未満です。「long型のリテラル0000007702062100Lは範囲外です。」を
スローする理由

1
@SantosshKumhar:これは8進数リテラルであり、数字8またはを含めることはできません9。先頭のゼロを削除します。
Lukas Eder

49

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

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

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

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

それがいることを注意、しないあなたの変数に言及testLongまたはタイプlongそれはですので、どこでもない、初期化について。問題は別の時点で発生しているようです。

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

  • int彼は何かをint値として扱いたいと思っていることを伝えます(あなたが望んでいたものではありません!)
  • 「範囲外」はかなり明確です:何かが期待される範囲内にない(おそらくの範囲外int
  • 「リテラル」:面白いですね。リテラルとは何ですか?

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

したがって、変数の宣言について実際に悩まされているわけではありませんが、数値自体は、値がそれについて悩まされているものです。

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

System.out.println(9223372036854775807);

PrintStream.printlnどちらか取ることができますか(または他のほとんど何でも)。そのコードは大丈夫でしょうか?intlong

まあ号、多分それはすべきことが、ルールに従ってそれはある罰金ではありません。

問題は、「いくつかの桁」であると定義されていることをintリテラルしたがってなければならないことによって定義された範囲内であることint

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

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

サイドノートでは:あなたは何も存在しないことを実現しますbyteshortリテラルは、あなたがまだ割り当て値(通常は可能intにリテラル)byteshort変数:特殊なルールに起因することが可能です割り当てConversonについて§5.2:彼らができるように、より大きなタイプの定数式の割り当てまたは場合種類が範囲内の値です。byteshortcharint


3
どこから時間がかかりますか;-)
Lukas Eder

3
@Lukas:私はたまに300の短いものを書く必要がないことを願って、そのような答えをときどき書きます;-)また、エラーメッセージの解釈を助けることは(うまくいけば)「エラーメッセージの意味」の質問が少なくなることを意味します。
Joachim Sauer

あなたの答えはとても良いです...疑いなく、それが賛成投票の理由ですが、それを編集して、最初に(あなたの答えの始め)、問題の正確な解決策を1行で書いて、次にあなたの説明の下に書いてください。多くの人々が深い説明ではなく迅速な解決策を求めているため
Shirish Herwade

4
彼らは他の2番目の回答を自由に見ることができます(最高投票数でも、迅速な解決策が得られます)。エラーメッセージを解析して理解する方法を人々に教えることは、長期的に見れば、単にエラーメッセージを表示するよりも役立つと思います。「人に魚を与えなさい…」そしてそれすべて。
Joachim Sauer

サイドノートをありがとう。
Venkatesh Goud、2015年

17

やってみてください9223372036854775807LL最後には、Java告げる9223372036854775807ですlong


0

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

double val = 9e300;

-2
long ak = 34778754226788444L/l;

どちらも使用しますが、一度に使用できるのは大文字のLまたは小文字のlだけです。

L / Lを使用する理由 なぜならlongは整数データ型の一部だからです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.