sch*_*ier 4 c integer-overflow integer-promotion
我有以下C代码:
uint8_t firstValue = 111;
uint8_t secondValue = 145;
uint16_t temp = firstValue + secondValue;
if (temp > 0xFF) {
return true;
}
return false;
Run Code Online (Sandbox Code Playgroud)
这是替代实现:
uint8_t firstValue = 111;
uint8_t secondValue = 145;
if (firstValue + secondValue > 0xFF) {
return true;
}
return false;
Run Code Online (Sandbox Code Playgroud)
第一个例子是显而易见的,uint16_t类型足够大以包含结果.当我clang在OS/X上使用编译器尝试第二个示例时,它正确返回true.那里发生了什么?是否有某种临时的,更大的类型来包含结果?
将操作数+提升为更大的类型,我们可以通过草拟C99标准部分6.5.6 添加运算符来看到这一点:
如果两个操作数都具有算术类型,则对它们执行通常的算术转换.
如果我们去6.3.1.8 常规算术转换它会说:
否则,将对两个操作数执行整数提升.
然后我们去6.3.1.1 布尔,字符和整数说(强调我的):
如果int可以表示原始类型的所有值,则该值将转换为int; 否则,它将转换为unsigned int.这些被称为整数促销 .48)所有其他类型由整数促销不变.
因此,+在这种情况下,两个操作数都将被提升为操作类型int,因此没有溢出.
注意,为什么在C和C++中的算术运算之前必须将short转换为int?解释了促销的理由.