long x = (long)(2147483649);
为什么这是错的?为什么我必须使用L和F表示浮点数和长数,但我可以使用(byte)例如?
答案 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
。
这是有效的,因为2147483647
是7fffffff
的十六进制 - 一个可接受的int
。
long x = (long)(2147483647);
答案 2 :(得分:0)
2147483649 = Integer.MAX_VALUE + 2
不能将其纳入int变量。
试试long x = 2147483649L;
答案 3 :(得分:0)