int类型的文字xyz超出范围

时间:2011-08-17 12:55:53

标签: java int long-integer

我目前正在使用Java中的数据类型,如果我理解正确,long类型接受范围之间的值:-9,223,372,036,854到+9,223,372,036,854,775,807。现在您可以在下面看到我创建了一个名为testLong的Long变量,但是当我插入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;

5 个答案:

答案 0 :(得分:183)

在结尾添加一个大写L

long value = 9223372036854775807L;

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

答案 1 :(得分:42)

  

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

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

让我们再看一遍:

  

int 9223372036854775807的字面值超出范围。

注意,在任何地方提及您的变量testLong或类型long,因此初始化 。问题似乎发生在其他方面。

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

  • int告诉我们,他希望将某些内容视为int值(这不是您想要的!)
  • “超出范围”非常明确:某些内容不在预期范围内(可能是int
  • “文字”:现在这很有趣:文字是什么?

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

所以它实际上并没有唠叨你关于变量声明,但是数字本身,这个数字正在唠叨你。

您可以在longint同等可接受的上下文中使用相同的文字来轻松验证这一点:

System.out.println(9223372036854775807);

PrintStream.println可以选择an inta long(或其他任何内容)。所以代码应该没问题吧?

没有。好吧,也许应该,但根据规则它 不好。

问题是that "some digits" is defined to be an int literal,因此必须int定义的范围内。

如果你想写一个long字面值,那么你必须通过附加L(或小写l来明确说明,但我高度建议你总是使用大写变体,因为它更容易阅读,更难以误认为1

请注意,float(后缀F / f)和double(后缀D / d)也会出现类似问题。

旁注:您会发现没有byteshort文字,您仍然可以将值(通常是int文字)分配给byte和{{ 1}}变量:由于§ 5.2 about Assignment Converson中的特殊规则,这是可能的:它们允许将较大类型的常量表达式分配给shortbyteshort或{{1 } 如果值在类型范围内。

答案 2 :(得分:13)

尝试做     9223372036854775807L

答案 3 :(得分:0)

过去我遇到过这个问题,我通过写出科学形式的价值来解决这个问题。 例如:

double val = 9e300;

答案 4 :(得分:-3)

long ak = 34778754226788444L/l;

两者都使用,但一次只使用大写L或小写l。

为什么要使用L / l?因为long是整数数据类型的一部分。