Литерал xyz типа int находится вне диапазона - PullRequest
81 голосов
/ 17 августа 2011

В настоящий момент я работаю с типами данных в Java, и, если я правильно понял, тип long принимает значение в диапазонах: от -9,223,372,036,854 до +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;

Ответы [ 5 ]

187 голосов
/ 17 августа 2011

Добавьте заглавную букву L в конец:

long value = 9223372036854775807L;

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

44 голосов
/ 17 августа 2011

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

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

Давайте посмотрим на это еще раз:

Буква int 9223372036854775807 отсутствуетдиапазона.

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

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

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

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

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

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

System.out.println(9223372036854775807);

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

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

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

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

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

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

13 голосов
/ 17 августа 2011

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

0 голосов
/ 13 июня 2018
long ak = 34778754226788444L/l;

Оба используют, но одновременно используют только заглавные буквы L или строчные l.

Зачем использовать л / л?Поскольку long является частью целочисленного типа данных.

0 голосов
/ 01 марта 2018

У меня была эта проблема в прошлом, и я исправил ее, записав значение в научной форме.например:

double val = 9e300;
...