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 原来如此,明白了
10 个月之前 回复
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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
LeetCode7——Reverse Integer(将一个整数反转,注意溢出的处理)
题目: 解法: 注意long long类型,表示64bit数字。
leetcode 7. Reverse Integer(C语言,翻转一个整数,判断是否溢出)19
leetcode 7. Reverse Integer(C语言,反向一个整数,判断溢出)19C语言解析及代码,另附判断溢出总结
hihoCoder挑战赛14 题目1 : 不等式
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定n个关于X的不等式,问最多有多少个成立。 每个不等式为如下的形式之一: X X X = C X > C X >= C 输入 第一行一个整数n。 以下n行,每行一个不等式。 数据范围: 1 输出 一行一个整数,表示最多可以同时成立的不等式个数。
整数溢出,如何判断整数溢出(没看明白,有空再看)
  整数溢出,如何判断整数溢出 收藏 c语言中存在两类整数算术运算,有符号运算和无符号运算。在无符号运算里,没有了符号位,所以是没有溢出的概念的。所有的无符号运算都是以2的n次方为模。如果算术运算符的一个操作数是有符号书,另一个是无符号数,那么有符号数会被转换为无符号数(表示范围小的总是被转换为表示范围大的),那么溢出也不会发生。但是,当两个操作数都是有符号数时,溢出就有可能发生。而且
【java解惑】长整数计算防止溢出
如下代码:public class Example003 { public static void main(String[] args) { final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000; final long MICROS_PER_DAY_L1 = 24 * 60 * 60 * 1000 * 1000L; fina
JAVA 整数溢出问题
int 类型在 Java 中是“有符号”的。所谓“有符号”就是有正负。在计算机中用二进制表示所有的信息,这个符号的区别就看首位。 首位如果是 0,就是正的,1 就是负的。正与负的区别也因此就在于取反加一。这不仅在 Java,在任何语言中都是这样的。 所谓数值溢出就会出现这个现象。Java 中的 int 总共就 32 位,正数上限的情况首位也只能是 0,其他位都可以是 1(就是 2^31-1 的
一个简单的溢出程序解析
下面是一段包含缓冲区溢出的代码: #include using namespace std; void attacker() { cout<<"Attacker is running."<<endl; exit(0); } void leak_func(char *str) { char local[4]; int i;
整数变换问题
问题描述: 整数变换问题。关于整数i的变换f和g定义如下:f(i)=3i;g(i)=i/2。 试设计一个算法,对于给定的2个整数n和m,用最少的f和g变换次数将n变换为m。 例如,可以将整数15用4次变换将它变换为整数4:4=gfgg(15)当整数 n 不可能变换为整数m时,算法应如何处理? 编程任务: 对任意给定的整数 n 和 m,编程计算将整数 n 变换为整数 m所需要的最少变换次数。
一个关于乘法溢出问题的探讨
答:在计算赋给X的值时,VB会使用一个临时变量.在此过程中,它使用的是一个与表达式中数据类型相同的临时变量.在上面的例子中,由于相乘的两个数都为整型(Integer),VB将使用一个整型的临时变量.当乘积超过32K(整型的极限)时,就会产生溢出错误.修正的方法是给表达式中的某个值指定一个类型标识符,强制VB使用一个足以容纳计算结果的临时变量.如:x=33*1000&尽管1000不是Long型数,但
整数溢出小问题
很多C教材上都说过: