为什么这个乘法整数溢出会导致零?

在回答了这个问题之后,我很困惑为什么这段代码中的整数溢出0而不是负数。奇怪,为什么这么精确的数字?为什么是0?

public class IntegerOverflow {

public static void main(String[] args) {

int x = 10;

int i = 0;

for (i = 0; i <= 5; i++)

{

x = x * x;

System.out.println(x);

}

}

}

输出:

100

10000

100000000

1874919424

0

0

回答:

回答:

根据JLS§15.17.1:

如果整数乘法溢出,则结果是数学乘积

,以某种足够大的二进制补码格式表示。结果,如果发生溢出,则结果的符号可能与两个操作数值的数学积的符号不同。

如果我们以二进制格式而不是十进制格式打印数字,这将变得更加明显:

public class IntegerOverflow {

public static void main(String[] args) {

int x = 10;

int i = 0;

for (i = 0; i <= 5; i++)

{

x *= x;

System.out.println(Integer.toBinaryString(x));

}

}

}

输出:

1100100

10011100010000

101111101011110000100000000

1101111110000010000000000000000

0

0

如您所见,每次平方时,零位数都会加倍。由于仅保存低位,因此每次加倍零将最终导致零。请注意,如果的起始值为奇数,则

x。相反,它将导致看似不相关的数字,如溢出通常那样。

public class IntegerOverflow {

public static void main(String[] args) {

int x = 11;

int i = 0;

for (i = 0; i <= 5; i++)

{

x *= x;

System.out.format("%-12d\t%s%n", x, Integer.toBinaryString(x));

}

}

}

输出:

121             1111001

14641 11100100110001

214358881 1100110001101101101101100001

772479681 101110000010110001101011000001

-1419655807 10101011011000011100010110000001

-1709061375 10011010001000011100101100000001

以上是 为什么这个乘法整数溢出会导致零? 的全部内容, 来源链接: utcz.com/qa/420128.html

回到顶部