x为偶数时,才会发生这种情况。
根据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)); } }}
输出:
110010010011100010000101111101011110000100000000110111111000001000000000000000000
如您所见,每次平方时,零位数都会加倍。由于仅保存低位,因此每次加倍零将最终导致零。请注意,如果的起始值为奇数,则
看不到这些尾随零
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("%-12dt%s%n", x, Integer.toBinaryString(x)); } }}
输出:
121 11110011464111100100110001214358881 1100110001101101101101100001772479681 101110000010110001101011000001-1419655807 10101011011000011100010110000001-1709061375 10011010001000011100101100000001
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)