Я встретил код у кого-то, кто, кажется, считает, что проблема вычитает целое число без знака из другого целого числа того же типа, когда результат будет отрицательным. Таким образом, такой код был бы неправильным, даже если он работает на большинстве архитектур.
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)
Какая или какая интерпретация правильная? Определяется ли это вообще?