为何这段Java代码执行后输出负数?
为什么这段Java代码输出负数?
你的代码里,x = x + 2 * x 等价于 x = 3 * x,也就是每次循环x都会变成原来的3倍。循环执行了30次(i从1到30,因为i < 31),最终要计算的是3^30的值。
问题出在Java的int类型限制上:
int是32位有符号整数,取值范围是 -2147483648 到 2147483647(也就是-2^31到2^31-1)。3^30的实际值是205891132094649,这个数远大于int能容纳的最大值2147483647,发生了整数溢出。
对于有符号整数来说,溢出后会按照补码规则循环:当数值超过最大值时,会从最小值开始往下计数,所以最终结果变成了负数。
要解决这个问题,只需要把x的类型换成long(64位有符号整数,范围足够容纳3^30),修改后的代码如下:
public class Program { public static void main(String[] args) { long x = 1; for (int i = 1; i < 31; i++) { x = x + 2 * x; } System.out.println(x); } }
运行后会输出正确的205891132094649。
内容的提问来源于stack exchange,提问作者Connor
相关产品推荐
相关产品推荐

