进行C语言short int加法时,如何避免和检测溢出?
- 内容介绍
- 文章标签
- 相关推荐
本文共计959个文字,预计阅读时间需要4分钟。
因为 short 是有符号整型,通常占用 2 个字节(-32768 到 32767),但在 C++ 的算术运算中会自动执行有符号提升操作:
- 常见错误现象:
short a = 32767; short b = 1; short c = a + b;,你以为c是 -32768?其实它可能是 32768(未定义行为),或被编译器优化掉判断逻辑 - 真正危险的不是加法本身,而是赋值回
short的那一步:c的类型是int,强制转成short属于「有符号整数溢出」,C++ 标准明确定义为未定义行为(UB) - 不同编译器表现不一:GCC 可能保留低 16 位(看似“绕回”),Clang 在 -fsanitize=undefined 下直接报错,Release 模式下甚至可能删掉整个分支
怎么安全地做 short 加法
别依赖隐式转换,显式控制边界和类型。核心原则:加之前升到足够宽的类型,加完再检查,最后只在确认安全时才缩回 short。
本文共计959个文字,预计阅读时间需要4分钟。
因为 short 是有符号整型,通常占用 2 个字节(-32768 到 32767),但在 C++ 的算术运算中会自动执行有符号提升操作:
- 常见错误现象:
short a = 32767; short b = 1; short c = a + b;,你以为c是 -32768?其实它可能是 32768(未定义行为),或被编译器优化掉判断逻辑 - 真正危险的不是加法本身,而是赋值回
short的那一步:c的类型是int,强制转成short属于「有符号整数溢出」,C++ 标准明确定义为未定义行为(UB) - 不同编译器表现不一:GCC 可能保留低 16 位(看似“绕回”),Clang 在 -fsanitize=undefined 下直接报错,Release 模式下甚至可能删掉整个分支
怎么安全地做 short 加法
别依赖隐式转换,显式控制边界和类型。核心原则:加之前升到足够宽的类型,加完再检查,最后只在确认安全时才缩回 short。

