我有以下 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_t
type 足够大以包含结果。
当我尝试第二个例子时clang
OS/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(使用前将#替换为@)