整数计算溢出的处理
2018-01-11 12:55
246 查看
在做PAT_A1065时,涉及到了long long型相加溢出的情况
下面以简单起见,以int型为例
由于计算机内部存储数据是以补码的形式,假设int型 占32位, 则取值范围为[-2^31, 2^31-1]
则int型 a + b 正溢出时的取值范围为 [2^31, 2^32-2], 计算机的处理是略去最高位,即 %2^32,
左界:2^31 % 2^32 = 2^31, 但是2^31用int存储时, 会自动转为-2^31, 这可以根据补码形式理解——
2^31的二进制表示为为1000 0000 0000 0000 0000 0000 0000 0000, 其在int型下就是表示为-2^31
右界:(2^32-2) % 2^32 = -2。
即越界时,范围为[-2^31, -2]
同理,负溢出时,取值范围为[-2^32, -2^31-1], 计算机的处理是略去最高位,即 %2^32,
左界:-2^32 % 2^32 = 0,
右界:(-2^31-1) % 2^32 = 2^31-1,同样可以根据二进制的补码理解(此处负数的取整不是很好理解,只能根据二进制来理解)
即越界时,范围为[0, 2^31 - 1]
综上正越界时,表现为 a > 0, b > 0, a + b < 0;
负越界时, 表现为 a < 0, b < 0, a + b >= 0;
记住这个结论。
另:long long型的a b相加只能先存放在另一个long long变量c中 才能与另一个long long型的d进行比较, 而不能在if 的条件中直接让 a+b > d 这样比较,否则会出错,具体为什么我也不知道,晴神说的。
下面以简单起见,以int型为例
由于计算机内部存储数据是以补码的形式,假设int型 占32位, 则取值范围为[-2^31, 2^31-1]
则int型 a + b 正溢出时的取值范围为 [2^31, 2^32-2], 计算机的处理是略去最高位,即 %2^32,
左界:2^31 % 2^32 = 2^31, 但是2^31用int存储时, 会自动转为-2^31, 这可以根据补码形式理解——
2^31的二进制表示为为1000 0000 0000 0000 0000 0000 0000 0000, 其在int型下就是表示为-2^31
右界:(2^32-2) % 2^32 = -2。
即越界时,范围为[-2^31, -2]
同理,负溢出时,取值范围为[-2^32, -2^31-1], 计算机的处理是略去最高位,即 %2^32,
左界:-2^32 % 2^32 = 0,
右界:(-2^31-1) % 2^32 = 2^31-1,同样可以根据二进制的补码理解(此处负数的取整不是很好理解,只能根据二进制来理解)
即越界时,范围为[0, 2^31 - 1]
综上正越界时,表现为 a > 0, b > 0, a + b < 0;
负越界时, 表现为 a < 0, b < 0, a + b >= 0;
记住这个结论。
另:long long型的a b相加只能先存放在另一个long long变量c中 才能与另一个long long型的d进行比较, 而不能在if 的条件中直接让 a+b > d 这样比较,否则会出错,具体为什么我也不知道,晴神说的。
相关文章推荐
- PAT1104. Sum of Number Segments (20) double计算和整数溢出
- 【java解惑】长整数计算防止溢出
- java 字符串转化为整数溢出问题处理
- [LeetCode 7]Reverse Integer(处理整数溢出)
- 整数数组中最大子数组的和有溢出如何处理
- Java中整数溢出的问题:int i=1000000;i*i为何等于-727379968,Java是如何处理溢出的?
- 【java解惑】长整数计算防止溢出
- 32位整数溢出处理-LeetCodeQ7:整数逆序
- 浮点数计算溢出处理问题、浮点数1.#INF和1.#IND 问题
- LeetCode7——Reverse Integer(将一个整数反转,注意溢出的处理)
- 浮点数计算溢出处理问题、浮点数1.#INF和1.#IND 问题
- Java 科学计算器(处理字符串,去括号,只能计算整数)
- 处理大整数------计算n!(阶层)
- 笔记:整数计算溢出
- 超长整数加法计算
- 黑马程序员之C#编程基础学习笔记:计算一个整数数组的所有元素的和。
- mysql中计算日期整数差
- 超出JavaScript安全整数限制的数字计算BigInt详解
- 计算机整数乘积计算
- LeetCode遇到的整数溢出