测试整数相加是否溢出
测试整数相加是否溢出
这个问题已经有答案了:
可能的重复问题:
我尝试实现一个简单的程序来测试整数加法是否会发生溢出:
#include #include #include using namespace std; string overflow(long a,long b){ return ((a+b)>UINT_MAX)?"true":"false"; } int main(){ long a, b; cout << "enter a and b: "; cin >> a >> b; string m = overflow(a,b); cout << m; return 0; }
UINT_MAX=65535
,所以我输入了65535和20,但它却写了false,为什么?
admin 更改状态以发布 2023年5月21日
unsigned int a = UINT_MAX; unsigned int b = 20; unsigned int c = a+b; cout << c << endl; //output 19
已经有一些关于溢出检测的问题在SO上了(例如C/C++中检测整数溢出的最佳方法)。也许你会发现它们有帮助。
给定无符号整数 a
和 b
,这个表达式永远无法评估为 true
:
(a+b) > UINT_MAX
它永远不可能是 true
,是因为 UINT_MAX
是最大值,所以无论什么结果 (a+b)
是什么,都不能大于 UINT_MAX
,因为那将是一个矛盾。
你尝试使用更大的数据类型 long
来绕过这个问题,但实际上这并不保证比 int
大。你可能想尝试使用 long long
替代(尽管这个类型在标准 C++ 中不存在)。
与 Java 不同,C++ 实际上并没有指定每种数据类型必须有多大,因此声称 UINT_MAX=65535
并不是普遍适用的。它只适用于无符号整数所占用的位数为 16 位的处理器。对于 32 位,UINT_MAX
是 4294967295
。