我遇到過來自某個人的代碼,這個代碼似乎認爲當結果是否定的時候,從另一個相同類型的整數中減去一個無符號整數是有問題的。因此,即使這種代碼恰好適用於大多數架構,這樣的代碼也是不正確的。是無符號整數減法定義的行爲?
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
這是我能找到的C標準中唯一含糊不清的相關引用。
涉及無符號的操作數的一種計算可以從未溢流,因爲一個 結果不能由所得到的無符號整數 類型來表示減小模比可以由表示的最大 值大一個數量結果類型。
我想可以採用這個引用來表示當右操作數較大時,操作被調整爲在模截斷數的上下文中是有意義的。
即
0×0000 - 0×0001 == 0X 0000 - 0×0001 == 0xFFFF的
,而不是使用實施依賴簽名的語義:
0×0000 - 0×0001 ==(無符號) (0 + 1)==(0xFFFF,但同時也0xFFFE或在0x8001)
哪個或哪些解釋是正確的?它是否定義?
標準中詞的選擇是不幸的。它「永遠不會溢出」意味着它不是一個錯誤情況。使用標準中的術語,而不是溢出值「包裝」。 – danorton