如何在C++中检测无符号十六进制数溢出并向用户提示
无符号32位整数加法溢出检测实现方案
一、无符号数溢出的判断逻辑
无符号整数加法遵循模2^32运算规则(对应uint32_t的最大值UINT32_MAX),判断溢出有两种可靠方式:
- 计算前检查:若
num1 > UINT32_MAX - num2,说明两数之和会超过uint32_t的最大值,必然发生溢出。 - 计算后检查:无符号数正常相加的结果必然大于等于任一输入数,若结果小于其中一个输入数,则说明发生了溢出。
两种方式均有效,计算前检查可提前预判,计算后检查更直观。
二、修改后的完整代码
需要引入<cstdint>头文件获取UINT32_MAX常量,同时加入溢出检测逻辑:
#include <iostream> #include <fstream> #include <string> #include <sstream> #include <cstdint> // 引入UINT32_MAX定义 using namespace std; uint32_t add(uint32_t num1, uint32_t num2) { return num1 + num2; } int main() { ifstream inputFile("input.txt"); string line; while(getline(inputFile, line)) { istringstream iss(line); string operation, hexNum1, hexNum2; iss >> operation >> hexNum1 >> hexNum2; uint32_t num1 = stoul(hexNum1, nullptr, 16); uint32_t num2 = stoul(hexNum2, nullptr, 16); uint32_t result = add(num1, num2); // 计算后检测溢出:无符号相加结果小于任一输入数则溢出 bool overflow = (result < num1) || (result < num2); cout << "ADD " << hexNum1 << " " << hexNum2 << " = " << "0x" << hex << result << endl; cout << "Overflow detected <" << (overflow ? "Yes" : "No") << ">" << endl; } inputFile.close(); return 0; }
三、可选优化:计算前检测
如果希望在计算前就判断溢出,可调整add函数通过引用返回溢出状态:
uint32_t add(uint32_t num1, uint32_t num2, bool& overflow) { overflow = (num1 > UINT32_MAX - num2); return num1 + num2; } // 主函数中调用方式 bool overflow = false; uint32_t result = add(num1, num2, overflow);
内容的提问来源于stack exchange,提问作者Lucent Luna
相关产品推荐
相关产品推荐

