首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Integer.MAX_VALUE*2返回-2?

为什么Integer.MAX_VALUE*2返回-2?
EN

Stack Overflow用户
提问于 2018-12-06 03:45:03
回答 1查看 1K关注 0票数 2

我在寻找i的值,其中i==i+1应该始终为true。其他一些人使用doublefloat来找到问题的解决方案。

我正在尝试回答一个关于堆栈溢出的问题。然后考虑整数,试着看看这是否也是可能的。

但在多次操作Integer.MAX_VALUEInteger.MIN_VALUE时,我发现了这个奇怪的行为:

Integer.MAX_VALUE + 1 == Integer.MIN_VALUE

但是Integer.MAX_VALUE * 2 == -2Integer.MAX_VALUE * 4 == -4

只有当我使用偶数值(2,4,6,8,10,12...)时才会发生这种情况。当我使用除1之外的奇数值时,会发生这种情况:

n != Integer.MIN_VALUEn > 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

这正是最让我困惑的地方。

EN

回答 1

Stack Overflow用户

发布于 2018-12-06 04:23:11

2147483647是最大值,现在尝试执行以下指令集:

代码语言:javascript
复制
int i = 2147483647;
i++;
System.out.println(i);//prints -2147483647 as the 32 bit limit exceeds 

2147483647的二进制等价物是0111111111111111111111111111111111111111

2的二进制等价物是0000000000000000000000000000000000000010

二进制加法是11000000000000000000000000000000000

符号注意:左边的最后一位代表符号, int 是32位有符号整数

因此,该数字变为-2147483647

代码语言:javascript
复制
i++;
System.out.println(i); // prints -2147483647

在同一行中,2147483647 * 2实际上是-> 2147483647 + 2147483647

代码语言:javascript
复制
int j = 2147483647;
j += 2147483647;
System.out.println(j); // prints -2

所以你回答说。现在当你做2147483647 * 3的时候,

它是:

2147483647 + 2147483647 + 2147483647 = -2 + 2147483647 = 2147483645

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53639652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档