上文中,我们学习了C++中获取int最大与最小值的两种方法:C++库和移位运算,这篇文章将解决在移位运算中遇到的各种报错,并提出一种新的生成int最值的方法
上文链接:http://t.csdnimg.cn/cn7Ad
移位运算取最值常见报错
DevC++报错
Line 35: Char 57: runtime error: signed integer overflow:
-2147483648 - 1 cannot be represented in type 'int'
(solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:44:57
源码
return int(max(min(sign*ans, (long long)((1<<31)-1)), (long long)(1<<31)));
原因&解决方法
这个错误提示表明在程序中发生了有符号整数溢出。具体来说,-2147483648 - 1
这个表达式导致了一个无法在类型 int
中表示的结果。
在 C++ 中,int
类型的取值范围通常是从 -2147483648
到 2147483647
(这是32位系统中的标准范围),因此 -2147483648 - 1
将导致溢出,得到的结果 -2147483649
不能用 int
类型表示。
为了避免这种溢出,可以考虑使用更大的数据类型来保存结果,例如 long long
类型。修改代码如下:
return int(max(min(sign*ans, (long long)((1LL<<31)-1)), (long long)(1<<31)));
十六进制取int最值
直接上代码
cout<<"int_max: 0x7FFFFFFF "<<0x7FFFFFFF<<endl;
cout<<"int_min: 0x80000000 "<<int(0x80000000)<<endl;
输出
我个人感觉这种方法更易于理解,也更方便运用