我目前正在使用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;
答案 0 :(得分:183)
在结尾添加一个大写L
:
long value = 9223372036854775807L;
否则,编译器将尝试将文字解析为int
,因此出现错误消息
答案 1 :(得分:42)
我不知道为什么它将long数据类型称为int
不是。您应该学会信任编译器消息(特别是当它们来自理智的现代编译器而不是古老的C / C ++编译器时)。虽然他们说的语言有时很难破译,但他们通常不会骗你。
让我们再看一遍:
int 9223372036854775807的字面值超出范围。
注意,不在任何地方提及您的变量testLong
或类型long
,因此初始化 。问题似乎发生在其他方面。
现在让我们研究一下消息的一些部分:
int
告诉我们,他希望将某些内容视为int
值(这不是您想要的!)int
)我会暂时离开舒适的列表来讨论文字:文字是你在代码中有一些价值的地方。有String
个文字,int
文字,class
文字等。每次在代码中明确提到值时,它都是文字。
所以它实际上并没有唠叨你关于变量声明,但是数字本身,这个数字正在唠叨你。
您可以在long
和int
同等可接受的上下文中使用相同的文字来轻松验证这一点:
System.out.println(9223372036854775807);
PrintStream.println
可以选择an int
或a long
(或其他任何内容)。所以代码应该没问题吧?
没有。好吧,也许应该,但根据规则它 不好。
问题是that "some digits" is defined to be an int
literal,因此必须在int
定义的范围内。
如果你想写一个long
字面值,那么你必须通过附加L
(或小写l
来明确说明,但我高度建议你总是使用大写变体,因为它更容易阅读,更难以误认为1
。
请注意,float
(后缀F
/ f
)和double
(后缀D
/ d
)也会出现类似问题。
旁注:您会发现没有byte
或short
文字,您仍然可以将值(通常是int
文字)分配给byte
和{{ 1}}变量:由于§ 5.2 about Assignment Converson中的特殊规则,这是可能的:它们允许将较大类型的常量表达式分配给short
,byte
,short
或{{1 } 如果值在类型范围内。
答案 2 :(得分:13)
尝试做 9223372036854775807L
答案 3 :(得分:0)
过去我遇到过这个问题,我通过写出科学形式的价值来解决这个问题。 例如:
double val = 9e300;
答案 4 :(得分:-3)
long ak = 34778754226788444L/l;
两者都使用,但一次只使用大写L或小写l。
为什么要使用L / l?因为long是整数数据类型的一部分。