当 C 表达式中发生整数溢出时会发生什么?

2024-02-29

我有以下 C 代码:

uint8_t firstValue = 111;
uint8_t secondValue = 145;
uint16_t temp = firstValue + secondValue;
if (temp > 0xFF) {
    return true;
}
return false;

这是替代实现:

uint8_t firstValue = 111;
uint8_t secondValue = 145;
if (firstValue + secondValue > 0xFF) {
    return true;
}
return false;

第一个例子很明显,uint16_ttype 足够大以包含结果。 当我尝试第二个例子时clangOS/X 上的编译器正确返回 true。那里会发生什么?有没有某种暂时的,更大的类型来包含结果?


的操作数为+被提升为更大的类型,我们可以通过以下方式看到这一点C99标准草案 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf部分6.5.6 加法算子其中说:

如果两个操作数都具有算术类型,则执行通常的算术转换 他们。

如果我们去6.3.1.8 常见的算术转换它说:

否则,将对两个操作数执行整数提升。

然后我们去6.3.1.1 布尔值、字符和整数其中说(强调我的):

如果一个int可以表示原始类型的所有值,则将该值转换为int; 否则,它被转换为无符号整型。这些被称为整数 促销活动.48) 所有其他类型都不会因整数提升而改变。

所以两个操作数+在这种情况下将被提升为类型int的操作,所以不存在溢出。

Note, 为什么在 C 和 C++ 中算术运算之前必须将 Short 转换为 int? https://stackoverflow.com/q/24371868/1708801解释促销的理由。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 C 表达式中发生整数溢出时会发生什么? 的相关文章

随机推荐