我在寻找i
的值,其中i==i+1
应该始终为true
。其他一些人使用double
和float
来找到问题的解决方案。
我正在尝试回答一个关于堆栈溢出的问题。然后考虑整数,试着看看这是否也是可能的。
但在多次操作Integer.MAX_VALUE
和Integer.MIN_VALUE
时,我发现了这个奇怪的行为:
Integer.MAX_VALUE + 1 == Integer.MIN_VALUE
但是Integer.MAX_VALUE * 2 == -2
和Integer.MAX_VALUE * 4 == -4
只有当我使用偶数值(2,4,6,8,10,12...)时才会发生这种情况。当我使用除1之外的奇数值时,会发生这种情况:
n != Integer.MIN_VALUE
和n > Integer.MIN_VALUE
所在的Integer.MAX_VALUE * n == Integer.MAX_VALUE - n + 1
为什么会这样呢?我是不是漏掉了什么?
编辑:我看到有人将问题标记为重复,但导航到引用的链接,我的问题不同。
如果它溢出,它会返回到最小值,并从那里继续。如果它下溢,它会返回到最大值,并从那里继续>。
我仔细阅读了那里的答案,但没有一个解释为什么:
如果x为偶数,则Integer.MAX_VALUE*x
应为-x
;如果y为奇数,则Integer.MAX_VALUE*y
应为Integer.MAX_VALUE-y+1
。
这正是最让我困惑的地方。
发布于 2018-12-06 04:23:11
2147483647是最大值,现在尝试执行以下指令集:
int i = 2147483647;
i++;
System.out.println(i);//prints -2147483647 as the 32 bit limit exceeds
2147483647的二进制等价物是0111111111111111111111111111111111111111
2的二进制等价物是0000000000000000000000000000000000000010
二进制加法是11000000000000000000000000000000000
符号注意:左边的最后一位代表符号, int
是32位有符号整数
因此,该数字变为-2147483647
i++;
System.out.println(i); // prints -2147483647
在同一行中,2147483647 * 2
实际上是-> 2147483647 + 2147483647
int j = 2147483647;
j += 2147483647;
System.out.println(j); // prints -2
所以你回答说。现在当你做2147483647 * 3
的时候,
它是:
2147483647 + 2147483647 + 2147483647
= -2 + 2147483647
= 2147483645
https://stackoverflow.com/questions/53639652
复制相似问题