結果が負になる場合に、同じ型の別の整数から符号なし整数を減算する問題があると信じているように見える誰かからコードを見つけました。したがって、このようなコードは、たまたまほとんどのアーキテクチャで機能しても、正しくありません。
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
これは、私が見つけたC標準からの漠然とした関連性のある唯一の引用です。
結果の符号なし整数型で表すことができない結果は、結果の型で表すことができる最大値よりも1大きい数を法として減じられるため、符号なしオペランドを伴う計算は決してオーバーフローできません。
右のオペランドが大きい場合、モジュロトランケートされた数値のコンテキストで意味がわかるように操作が調整されることを意味するために、その引用を使用できると思います。
すなわち
0x0000-0x0001 == 0x 1 0000-0x0001 == 0xFFFF
実装に依存する署名されたセマンティクスを使用するのとは対照的に:
0x0000-0x0001 ==(符号なし)(0 + -1)==(0xFFFF、ただし0xFFFEまたは0x8001)
どちらの解釈が正しいですか?それはまったく定義されていますか?