简单代码没问题
long x = Integer.MAX_VALUE;
System.out.println(x * 2 + "...." + Long.MAX_VALUE);
= 4294967294....9223372036854775807
但是这里发生了什么?为什么-2
System.out.println(2 * Integer.MAX_VALUE + "...." + Long.MAX_VALUE);
= -2....9223372036854775807
以及为什么元素是149998,编译器是否将这些转换为long?
long elements = 2 * Integer.MAX_VALUE + 150000;
System.out.println(elements + "...." + Long.MAX_VALUE);
149998....9223372036854775807
-Thanks
答案 0 :(得分:6)
将变量从整数提升为长整数。
long elements = 2 * Integer.MAX_VALUE + 150000;
应该是
long elements = 2L * Integer.MAX_VALUE + 150000;
对原始陈述的评价,
long elements = 2 * Integer.MAX_VALUE + 150000;
相当于
long elements = (long)(2 * Integer.MAX_VALUE + 150000);
答案 1 :(得分:3)
and why elements is 149998, doesn't the compiler converts these to long?
确实如此,但只有在算术之后。所以你有int * int + int,这是一个int。然后它将把它投入很长时间。但是,此时你有一个整数溢出(即它超出了整数的范围)
你需要将右边的数字转换为长的第一个
long elements = 2L * Integer.MAX_VALUE + 150000;
或
long elements = 2 * (long)Integer.MAX_VALUE + 150000;
乙
答案 2 :(得分:1)
Integer.MAX_VALUE =2147483647=01111111 11111111 11111111 11111111
并且
2*Integer.MAX_VALUE=4294967294=2*(01111111 11111111 11111111 11111111)
=this will result a 33-bit value
但在Java int
中最多可以代表32位。
答案 3 :(得分:0)
我还没有足够的回复评论:(。
Oracle Java教程确认它会将数据转换为基本类型。由于您要添加int和long,因此编译器会在将数据转换为long之前添加数据。如果你真的希望它在整个时间内都很长,你必须输入强制转换。
EX;
// (long) is typcasted
long elements = 2 * (long) Integer.MAX_VALUE + 150000;
//prints elements as a long t + "" + max value
System.out.println(elements + "...." + Long.MAX_VALUE);
通过在当前数据类型前面添加所需的基元类型来预先输入类型。