You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 03:12:06