在回答了这个问题之后,我很困惑为什么这段代码中的整数溢出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
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));
}
}
}
输出:
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
为什么我在下面的代码段中的X轴上有一个溢出? 在我的网格容器上应用时,就会产生溢出。 null null https://codepen.io/anon/pen/wdjexz?editors=1100
所以浮点运算是不精确的,但这并不能完全解释这里发生的事情:
问题内容: 为什么需要添加“ L”字母以获得正确的长值?还有什么其他价值呢? 问题答案: 你的第一个值实际上是一个long(因为是,并且是,所以带值的值的结果就是一个long值。 但是第二个值是一个整数(因为你仅将一个值与一个值混用。所以结果将是一个整数。现在,所获得的结果超出了整数的实际范围。因此,在分配给该变量之前,被截断以适合有效的整数范围。 查看以下打印语句: 当你运行上面的代码时: 输出
我在写Fizz Buzz的时候遇到了一个意想不到的互动。如果我执行
下面的代码在执行时会产生堆栈溢出错误。然而,如果移除其中任何一个