上文中,我們學習了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;
輸出
我個人感覺這種方法更易于理解,也更方便運用