为什么我不能(长期)推广int?

时间:2016-03-03 10:01:18

标签: java variables casting

long x = (long)(2147483649);

为什么这是错的?为什么我必须使用L和F表示浮点数和长数,但我可以使用(byte)例如?

4 个答案:

答案 0 :(得分:2)

您的问题在技术上与Java规范有关。见https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10

  

int类型的最大十进制文字是2147483648(2 ^ 31)。

     

从0到2147483647的所有小数文字都可以出现在int的任何位置   文字可能会出现。十进制文字2147483648可能仅显示为   一元减运算符的操作数 - (§15.15.4)。

     

如果出现十进制文字2147483648,则为编译时错误   除了作为一元减运算符的操作数之外的任何地方;或者如果   int类型的十进制文字大于2147483648(2 ^ 31)。

为什么呢? 因为,正如其他人之前所说,只有32位,你只能代表 - 2147483648 2147483647 (2 ^ 32个不同的数字)。因此,在推广它之前,编译器需要能够代表它,但它不能。实际上,java规范表明这是一个编译时错误。 int类型的最大十进制文字是 2147483648 (2 ^ 31)。

只需在文字的末尾添加一个L / l( 2147483649L ),指定它是long类型的文字,现在它可以包含更大的数字。

  

如果整数文字以ASCII为后缀,则其长度为long   字母L或l(ell);否则它的类型为int(§4.2.1)。后缀   L是优选的,因为字母l(ell)通常很难   区别于数字1(一)。

因此,十进制格式中只有两种类型的文字数字(对于整数)。

答案 1 :(得分:0)

可以,但不是int。您尝试投射的数字是80000001十六进制。此号码不是有效的int

这是有效的,因为21474836477fffffff的十六进制 - 一个可接受的int

    long x = (long)(2147483647);

答案 2 :(得分:0)

2147483649 = Integer.MAX_VALUE + 2

不能将其纳入int变量。 试试long x = 2147483649L;

答案 3 :(得分:0)

整数范围定义在Integer.MIN_VALUEInteger.MAX_VALUE之间( -2147483648 2147483647 ) 您的号码 2147483649 超出该范围,因此无法将事件视为有效整数

您的编译器甚至应该抱怨:

enter image description here