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

如何处理C++中输入值超出变量存储范围引发的溢出异常?

C++ 输入超出short类型范围的异常预防方案

你遇到的场景核心问题是有符号整数溢出属于C++标准规定的未定义行为,值存入short变量的瞬间就可能触发崩溃,所以不能依赖存储后的变量值做校验。可以用以下两种方案解决:


方案1:先读取到更大范围的整数类型,再做范围校验

这是最稳妥、可精确区分错误类型的方案:先把输入存入取值范围远大于short的int/long long类型,确认值落在short的合法区间后,再转成short使用。
示例代码:

#include <iostream>
#include <climits> // 头文件内置short类型上下限定义SHRT_MAX、SHRT_MIN
using namespace std;

int main() {
    long long input_val;
    cin >> input_val;
    // 存储前先校验范围
    if (input_val > SHRT_MAX || input_val < SHRT_MIN) {
        // 此处写你的溢出异常处理逻辑
        cout << "输入值超出short类型允许范围" << endl;
        return 1;
    }
    short a = static_cast<short>(input_val);
    cout << a << endl;
    return 0;
}

方案2:检测输入流的错误状态

C++标准输入流在读取值超出目标类型范围、或输入类型不匹配时,会自动设置failbit错误标记,你可以直接判断流状态来捕获异常:
示例代码:

#include <iostream>
using namespace std;

int main() {
    short a;
    cin >> a;
    if (!cin) { // 流状态异常,包含溢出、类型不匹配等所有输入错误
        // 此处写你的异常处理逻辑
        cout << "输入非法" << endl;
        // 必须重置流状态、清空缓冲区才能继续后续输入操作
        cin.clear();
        cin.ignore(1024, '\n');
        return 1;
    }
    cout << a << endl;
    return 0;
}

该方案的局限性是无法区分异常是输入溢出还是输入了非数字字符,仅适合不需要细分错误类型的场景。


注意:绝对不要尝试读取到short变量后再判断值是否超出范围,有符号整数溢出的未定义行为会导致判断逻辑完全失效,甚至程序在判断执行前就已经崩溃。

内容的提问来源于stack exchange,提问作者user16548504

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:54:03