Литеральный xyz типа int вне диапазона

Я работаю с типами данных на данный момент в Java, и, если я правильно понял, тип long принимает значение между диапазонами: -9,223,372,036,854 - +9,223,372,036,854,775,807. Теперь, как вы можете видеть ниже, я создал длинную переменную с именем testLong, хотя, когда я вставляю в нее 9223372036854775807, я получаю сообщение об ошибке:

"Литерал 9223372036854775807 типа int находится за пределами допустимого диапазона.

Я не знаю, почему это относится к типу данных 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;

Ответ 1

Добавьте капитал L в конец:

long value = 9223372036854775807L;

В противном случае компилятор попытается проанализировать литерал как int, следовательно, сообщение об ошибке

Ответ 2

Я не знаю, почему это относится к длинному типу данных как int

Это не так. Вы должны научиться доверять сообщениям компилятора (особенно, когда они из нормальных, современных компиляторов, а не с древними компиляторами C/С++). Хотя язык, на котором они говорят, может быть трудно расшифровать порой, они обычно не лгут вам.

Посмотрите еще раз:

Литерал int 9223372036854775807 выходит за пределы допустимого диапазона.

Обратите внимание, что не не упоминает вашу переменную testLong или тип long в любом месте, поэтому не об инициализации. Проблема, похоже, происходит в какой-то другой точке.

Теперь давайте рассмотрим некоторые части сообщения:

  • int говорит нам, что он хочет рассматривать что-то как значение int (это не то, что вы хотели!)
  • "вне диапазона" довольно ясно: что-то не в пределах ожидаемого диапазона (возможно, от int)
  • "Литерал": теперь это интересно: что такое буквальный?

Я останусь в уютном списке, чтобы поговорить о литералах на мгновение: литералы - это места, где у вас есть какая-то ценность в вашем коде. Есть String литералы, int литералы, class литералы и т.д. Каждый раз, когда вы указываете значение явно в своем коде, это буквальный.

Таким образом, это не означает, что вы навязываете вам объявление переменной, но сам номер, значение - это то, что вам нужно.

Вы можете легко проверить это, используя тот же литерал в контексте, где одинаковые допустимы long и int:

System.out.println(9223372036854775807);

PrintStream.println может принимать a int или a long (или почти все остальное). Так что код должен быть точным, не так ли?

Нет. Ну, может быть, должно быть, но по правилам не очень хорошо.

Проблема заключается в что "некоторые цифры" определены как литерал int, и поэтому должен в диапазоне, определяемом int.

Если вы хотите написать литерал long, то вы должны сделать это явным, добавив L (или в нижний регистр L, но я высоко), чтобы вы всегда использовали верхний -case вариант, потому что его гораздо легче читать и сложнее ошибиться для 1).

Обратите внимание, что аналогичная проблема возникает при float (постфикс F/F) и double (постфикс D/D).

Примечание: вы поймете, что нет литералов byte или short, и вы все равно можете присвоить значения (обычно int литералы) переменным byte и short: это возможно из-за специальных правила в § 5.2 о Assignment Converson: они позволяют присваивать константным выражениям более крупного типа byte, short, char или int, если значения находятся в пределах диапазона типов.

Ответ 3

Попробуйте сделать   9223372036854775807L