Ответ 1
Добавьте капитал L
в конец:
long value = 9223372036854775807L;
В противном случае компилятор попытается проанализировать литерал как 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;
Добавьте капитал L
в конец:
long value = 9223372036854775807L;
В противном случае компилятор попытается проанализировать литерал как int
, следовательно, сообщение об ошибке
Я не знаю, почему это относится к длинному типу данных как 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
, если значения находятся в пределах диапазона типов.
Попробуйте сделать 9223372036854775807L