当我在java中执行此代码时:
long l = 999_999_999_999;
我收到以下错误,
error: integer number too large: 999999999999
long l = 999_999_999_999;
但是,如果我通过在结尾处添加long
或l
将该数字明确指定为L
,则问题就会消失。
long l = 999_999_999_999L; // Works
我的问题是,为什么?
我知道默认情况下java中的所有整数文字都是integer
,但是为什么它会阻止java进行类型转换并将值容纳为long,当long长度明显足以容纳字面值时? / p>
我正在寻找一些技术细节。
答案 0 :(得分:2)
Java不会自动将int
字面值转换为long
,因为int
字面值首先无效。这就是long
文字存在的原因,因此数量级更大的值可以表示为文字。
如果int类型的十进制文字大于2147483648(2 31 ),或者十进制文字2147483648出现在除一元的操作数以外的任何地方,则为编译时错误运算符(第15.15.4节)。
在Java中,您只能拥有大于int
的{{1}}字面值,即使它的唯一用途是为Integer.MAX_VALUE
分配值。较大的文字必须为long
,后缀为long
。
答案 1 :(得分:2)
这是完美的意图。
考虑如何解析程序。将Java源代码拆分为标记的词法分析器知道文字的两个部分:
[L|l]
[L|l]
最后没有长指示符的文字被解析为整数。这意味着文字本身无效,因为您不允许定义一个整数文字,该文字大于您可以用int
表示的较大数字。
语法规范here中明确了这一点:
如果整数文字后缀为ASCII字母L或l(ell),则其长度为long; 否则为int (§4.2.1)。
如果int 类型的十进制文字 大于2147483648(231),或者十进制文字2147483648出现在除as以外的任何位置,则为编译时错误一元减运算符的操作数(第15.15.4节)。
即使没有任何作业,如果你有表达式
999_999_999_999
这被解析为整数文字,但其值超过了允许的最大值,因此它是非法的。事实上,这个表达式的值后来被分配给某个东西是无关紧要的。
答案 2 :(得分:0)
如果你明白你的问题。您必须了解Java如何读取并为变量赋值。
Java首先读取要分配给变量的值,即" 99999999"然后将其分配给变量。
没有" L"最后,Java读取数字的值,但遇到的问题是它对于int来说太大了。与" L"最后,Java知道它很长,因此它足够大。