現在、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;
末尾に大文字のL
を追加します。
long value = 9223372036854775807L;
そうでない場合、コンパイラはリテラルをint
として解析しようとするため、エラーメッセージ
なぜlongデータ型をintとして参照しているのかわかりません
そうではない。コンパイラメッセージを信頼することを学ぶ必要があります(特に、それらが古代のC/C++コンパイラではなく、健全な現代のコンパイラからのものである場合)。彼らが話す言語は時々解読するのが難しいかもしれませんが、彼らは通常あなたに嘘をついていません。
もう一度見てみましょう。
Int 9223372036854775807のリテラルは範囲外です。
それは、ではなく変数testLong
またはタイプlong
に言及していないため、not初期化について。問題は、他のいくつかのポイントで発生するようです。
次に、メッセージの一部を調べてみましょう。
int
は、何かをint
値として扱うことを望んでいることを示します(これはあなたが望んだものではありません!)int
の範囲内にある)居心地の良いリストから離れて、リテラルについて少し話しましょう。リテラルとは、コードに何らかの価値がある場所です。 String
リテラル、int
リテラル、class
リテラルなどがあります。コードでvalueを明示的に言及するたびに、それはリテラルです。
だから、実際には変数宣言についてあなたを悩ませているのではなく、数値自体、値があなたを悩ませているものです。
long
とint
が等しく受け入れられるコンテキストで同じリテラルを使用すると、これを簡単に確認できます。
System.out.println(9223372036854775807);
PrintStream.println
は an 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 :より大きい型の定数式をbyte
、short
に割り当てることができます。 char
またはint
if値は型の範囲内です。
9223372036854775807Lを試してください
私は過去にこの問題を抱えていましたが、科学的な形で価値を書くことでそれを修正しました。例えば:
double val = 9e300;