Я наткнулся на код человека, который, кажется, полагает, что существует проблема с вычитанием беззнакового целого числа из другого целого числа того же типа, когда результат был бы отрицательным. Так что такой код будет неправильным, даже если он работает на большинстве архитектур.
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
Это единственная неопределенно релевантная цитата из стандарта C, которую я смог найти.
Вычисление с использованием беззнаковых операндов никогда не может быть переполнено, потому что результат, который не может быть представлен результирующим целочисленным типом без знака, уменьшается по модулю числа, которое на единицу больше наибольшего значения, которое может быть представлено результирующим типом.
Я полагаю, что можно было бы принять эту цитату как означающую, что, когда правый операнд больше, операция корректируется, чтобы иметь смысл в контексте усеченных по модулю чисел.
т.е.
0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF
в отличие от использования зависимой от реализации подписанной семантики:
0x0000 - 0x0001 == (без знака) (0 + -1) == (0xFFFF, но также 0xFFFE или 0x8001)
Какая или какая интерпретация верна? Это вообще определяется?