正在检查多个数字是否溢出
Checking multiple numbers for overflow
我在检测溢出时遇到问题。我应该制作一个程序,读取一个int c,然后读取n对应该相乘的数字。数字相乘后,您需要检查它是否为整数溢出。如果不是溢出,则打印相乘后的数字。
在c++中;
这里有一个例子:
输入:3 2147483647和2147483647
18446744073709551615和2个
666013和1
输出:
4611686014132420609
Overflow!
666013
fin>>c;
for (i=1;i<=c;i++,p=0){
fin>>a>>b;
p=a*b;
if (p/b==a)
fout<<p<<"n";
else
fout<<"Overflow"<<"n";
}
return 0;
}
您已经陷入了试图使用结果来测试是否存在溢出的陷阱。事实上你不能那样做。有符号整数溢出有未定义的行为,所以一旦发生这种情况,你就已经完蛋了。必须使用操作数检查是否存在重载,在操作之前。
设max
为可表示的最大整数。假设操作数为正,则a * b
溢出当且仅当a * b > max
。但是您不能执行该测试,因为如果a * b
溢出,则结果不可用。此外,我们知道没有一个整数大于max
,所以测试总是错误的。
那么,在不使用a * b
的结果的情况下,我们如何使用该方程呢?我们将利用数学的魔力,得到一个等价的方程:a > max / b
。我们只使用整数除法运算符,它不会溢出,尼斯!现在,只有当b != 0
。尝试分割max / 0
将是一个错误。但是,我们知道a * 0
对任何a
都不会溢出,所以我们可以简单地实现这种特殊情况。
因此,我们拥有的是:
int a, b;
// don't forget to initialize
if(b && a > INT_MAX / b)
// overflow, abort!
else
// no overflow, proceed
这只适用于正输入。我将把它作为一个练习留给读者来实现对所有整数的测试。
相关文章:
- 用于检查数字是否有数字或可被该数字的值整除的程序
- 如何使用递归检查数字是否有重复数字?
- 查找数字是否为 2 的幂的时间复杂度
- 将 C 函数转换为 C++ 以检查数字是否有效
- 检查数字是否为素数的算法
- 在C/C++中检查数字是否为整数(不带scanf/gets/etc)
- 如何以更有效的方式检查一个数字是否是素数?
- C++显示两个区间之间的数字的程序检查一个数字是否可以表示为两个素数的总和
- 如何检查字段中输入的数字是否重复
- 查看数字是否包含在未排序的双数字间隔内的最有效方法?
- 检查数字是否已在数组中的程序
- 编写一个函数,用递归函数检查数字是否是正方形
- 使用模量来找出数字是否可以除去不起作用的变量
- 查找数字是否为素数 c++
- 如何测试某些数字是否沿区间均匀分布?
- 这是确定两个数字是否具有相同奇偶校验的正确方法
- 如何检查 stdin 中的数字是否小于给定类型的数字限制
- 更好的算法来检查一个数字是否既不是素数也不是单个素数的幂
- 如何在不使用数学的情况下知道一个数字是否是回文
- 验证每个数字是否在特定条件下