2 oz vessalius Oz_Vessalius 于 2017.09.03 16:14 提问

新手问一个关于整数溢出的问题

public class Test {
public static void main(String[] args) {
int integer = 2147483647 + 2;
System.out.println(integer);
}
}

请问为什么整数溢出后输出结果是-2147483647?

11个回答

caozhy
caozhy   Ds   Rxr 2017.09.03 16:26
已采纳

你还可以用时钟的方式来理解,假设一个时钟上有如下刻度
-2147483648 --2147483647 -2147483646 -2147483645 ... -3 -2 -1 0 1 2 3 4 ... 2147483645 2147483646 2147483647 (后面接上 -2147483648,转一圈回来)
把这些数字构成一个圆环
加法就是往顺时针拨,减法就是往逆时针拨。
你从2147483647 加2,就是往后拨2格,因为是一个圆环,所以是--2147483647

caozhy
caozhy   Ds   Rxr 2017.09.03 16:23

因为负数的表示方式是,二进制第一位为1,后面取补码。
所以2147483647是二进制01111.....1(31个1)
+2以后是
1000...01(中间30个0)
也就是补码是000...0001,对应的值就是-2147483647

baidu_38996156
baidu_38996156   2017.09.03 16:39

图片说明
这是一个4位数补码图,int型算法可以参考这个图
你可以把它当做是一个圆,一分为2,一半为正数(二进制第一位为0),一半为负数(二进制第一位为1)

Oz_Vessalius
Oz_Vessalius 原来如此,明白了
3 个月之前 回复
jdz199409
jdz199409   2017.09.18 14:13

我才知道,原来这个问题还有这么多种解答方法 Orz

qq_24041497
qq_24041497   2017.10.07 16:54

int的范围是-2147483648-2147483647,相当于一个环,2147483647再往后两个数就是-2147483647

DACO2017
DACO2017   2017.09.20 18:24

数据是要存储在字节里的,而不同数据类型拥有的字节数是固定的。比如 int 整数一般是32位也就是4个字节。想象一下,这四个字节就如同一个杯子,而这个整数的大小就像往里面装的水的多少,水太多了(整数太大)就溢出了嘛!至于溢出的结果实际上不必花心思理解透(实际上如果了解关于字节的基础知识的话,这个问题是很好理解的)。最重要的是编程时注意选择匹配的数据类型。

Mr_Sjian
Mr_Sjian   2017.09.21 15:45

把一个一维数轴的两端连起来形成一个圆。。。。

hy_coming
hy_coming   2017.10.15 20:00

这是一维数轴的两端连起来形成一个圆,int的范围是-2147483648-2147483647,...2147483646、2147483647、-2147483648、-2147483647、-2147483646...所以结果就是你看到的这样

weixin_37513858
weixin_37513858   2017.10.17 11:00

前面的解答已经很详细了

xiaobai_aaa
xiaobai_aaa   2017.10.23 21:42

图片说明

共11条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!