В настоящее время я работаю с типами данных на Java, и, если я правильно понял, тип long
принимает значение в диапазоне от -9,223,372,036,854,775,808 до +9,223,372,036,854,775,807. Теперь, как вы можете видеть ниже, я создал long
переменную с именем 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;
java
int
long-integer
Мэтью Доннан
источник
источник
Ответы:
В
L
конце добавьте заглавную букву:long value = 9223372036854775807L;
В противном случае компилятор попытается проанализировать литерал как символ
int
, поэтому сообщение об ошибкеисточник
8
или9
. Удалите ведущие нули.Нет. Вы должны научиться доверять сообщениям компилятора (особенно если они поступают от нормальных современных компиляторов, а не от старых компиляторов C / C ++). Хотя язык, на котором они говорят, иногда бывает трудно расшифровать, обычно они не лгут вам.
Посмотрим на это еще раз:
Обратите внимание, что в нем нигде не упоминается ваша переменная
testLong
или типlong
, поэтому речь не идет об инициализации. Проблема, кажется, возникает в другом месте.Теперь давайте исследуем некоторые части сообщения:
int
сообщает нам, что хочет рассматривать что-то какint
ценность (а это не то, что вы хотели!)int
)Я оставлю удобный список, чтобы поговорить на мгновение о литералах: литералы - это места, где у вас есть некоторая ценность в вашем коде. Есть
String
литералы,int
литералы,class
литералы и так далее. Каждый раз, когда вы явно упоминаете значение в своем коде, это литерал.Так что на самом деле вас не беспокоит объявление переменной, а само число, значение - вот что вас беспокоит.
Вы можете легко проверить это, используя один и тот же литерал в контексте, где a
long
и anint
одинаково приемлемы:System.out.println(9223372036854775807);
PrintStream.println
может принимать либо илиint
long
(или почти что угодно еще). Так что с этим кодом все должно быть хорошо?Нет . Ну, может быть , это должно быть, но в соответствии с правилами , это является не в порядке.
Проблема в том, что «некоторые цифры» определены как
int
литералы и, следовательно, должны находиться в диапазоне, определяемомint
.Если вы хотите написать
long
литерал, вы должны сделать это явным, добавивL
(или нижний регистрl
, но я настоятельно рекомендую вам всегда использовать вариант в верхнем регистре, потому что его намного легче читать и сложнее принять за а1
).Обратите внимание, что аналогичная проблема возникает с
float
(postfixF
/f
) иdouble
(postfixD
/d
).Боковое примечание: вы поймете, что литералов
byte
или нет,short
и вы все еще можете присваивать значения (обычноint
литералы)byte
иshort
переменным: это возможно из-за специальных правил в § 5.2 о Конверсии присвоения : они позволяют присваивать постоянные выражения большего типа кbyte
,short
,char
или ,int
если значения находятся в пределах типов диапазона.источник
Попробуйте сделать
9223372036854775807L
. ВL
конце указывает Java, что9223372036854775807
этоlong
.источник
У меня была эта проблема в прошлом, и я исправил ее, записав значение в научной форме. например:
double val = 9e300;
источник
long ak = 34778754226788444L/l;
Оба используют, но одновременно только один использует заглавную L или строчную l.
Зачем использовать л / л? Потому что long является частью интегрального типа данных.
источник