Long的显式规范,Long

时间:2015-01-09 19:57:30

标签: java

当我在java中执行此代码时:

long l = 999_999_999_999;

我收到以下错误,

error: integer number too large: 999999999999
        long l = 999_999_999_999;

但是,如果我通过在结尾处添加longl将该数字明确指定为L,则问题就会消失。

long l = 999_999_999_999L; // Works

我的问题是,为什么?

我知道默认情况下java中的所有整数文字都是integer,但是为什么它会阻止java进行类型转换并将值容纳为long,当long长度明显足以容纳字面值时? / p>

我正在寻找一些技术细节。

3 个答案:

答案 0 :(得分:2)

Java不会自动将int字面值转换为long,因为int字面值首先无效。这就是long文字存在的原因,因此数量级更大的值可以表示为文字。

根据JLS, Section 3.10.1

  

如果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知道它很长,因此它足够大。