我有下面的C代碼:當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
類型是大到足以容納結果。 當我在OS/X上使用clang
編譯器嘗試第二個示例時,它正確地返回true。那裏會發生什麼?有沒有某種臨時,更大的類型來包含結果?
對於無符號類型,結果是「它應該是」以接收變量的大小爲模。我的意思是:只有適合的位被存儲;剩下的(如果有的話)被忽略。對於簽名類型,結果是未定義的。 – wildplasser 2014-10-04 18:39:30