int类型的文字xyz超出范围

Mat*_*nan 86 java int long-integer

我目前正在使用Java中的数据类型,如果我已正确理解该类型long接受范围之间的值:-9,223,372,036,854到+9,223,372,036,854,775,807.现在你可以在下面看到我创建了一个名为Long的变量testLong,虽然当我插入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;
Run Code Online (Sandbox Code Playgroud)

Luk*_*der 189

添加资金L到最后:

long value = 9223372036854775807L;
Run Code Online (Sandbox Code Playgroud)

否则,编译器将尝试将文字解析为int,因此错误消息

  • 它是Java语言规范.查找全文[here](http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html) (4认同)

Joa*_*uer 46

我不知道为什么它将long数据类型称为int

它不是.您应该学会信任编译器消息(特别是当它们来自理智的现代编译器而不是古老的C/C++编译器时).虽然他们说的语言有时很难破译,但他们通常不会骗你.

让我们再看一遍:

int 9223372036854775807的字面值超出范围.

请注意,它没有testLonglong任何地方提及您的变量或类型,因此它与初始化无关.问题似乎发生在其他一些问题上.

现在让我们研究一下消息的一些部分:

  • int告诉我们他想把某事当作一种int价值(这不是你想要的!)
  • "超出范围"非常清楚:有些东西不在预期的范围内(可能是int)
  • "文字":现在这很有趣:什么是文字?

我将离开舒适的列表来讨论文字片刻:文字是你在代码中有一些价值的地方.有String文字,int文字,class文字等.每次在代码中明确提到值时,它都是文字.

所以它实际上并没有唠叨变量声明,而是数字本身,价值就是它唠叨你的意思.

您可以通过在a long和a int同样可接受的上下文中使用相同的文字来轻松验证这一点:

System.out.println(9223372036854775807);
Run Code Online (Sandbox Code Playgroud)

PrintStream.println可以采取一个int一个long(或几乎任何其他).所以代码应该没问题吧?

号哦,也许这应该是,但按规定它不精.

问题是"某些数字"被定义为int文字,因此必须在由...定义的范围内int.

如果你想写一个long文字,那么你必须通过附加L(或小写l,但我强烈建议你总是使用大写变体,因为它更容易阅读,更难以误解a 1)来明确表达.

请注意,float(postfix F/ f)和double(postfix D/ d)会出现类似的问题.

旁注:你会发现没有byteshort文字,你仍然可以为值和变量分配值(通常是int文字):由于第5.2节关于赋值转换的特殊规则,这是可能的:它们允许分配更大类型的常量表达式到,,或如果值是类型的范围内.byteshortbyteshortcharint

  • 他们可以自由地查看其他第二个答案(投票最多的答案甚至可以提供快速解决方案).我认为,教育人们如何解析和理解错误消息从长远来看比仅为他们做更有用."给一个人一条鱼......"以及所有这一切. (4认同)
  • 你在哪里花时间;-) (3认同)
  • @Lukas:我偶尔会写这样的答案,希望我不必写300个较短的答案;-)另外:帮助解释错误信息(希望)意味着更少"错误信息是什么意思"的问题. (3认同)

jon*_*tro 13

试试做9223372036854775807L