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