Natknąłem się na kod kogoś, kto wydaje się sądzić, że istnieje problem z odejmowaniem liczby całkowitej bez znaku od innej liczby całkowitej tego samego typu, gdy wynik byłby ujemny. Tak więc taki kod byłby niepoprawny, nawet gdyby działał na większości architektur.
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
To jedyny niejasny cytat ze standardu C, jaki udało mi się znaleźć.
Obliczenie obejmujące operandy bez znaku nigdy nie może przekroczyć wartości, ponieważ wynik, którego nie można przedstawić za pomocą wynikowego typu liczby całkowitej bez znaku, jest redukowany modulo o liczbę, która jest o jeden większa niż największa wartość, która może być reprezentowana przez wynikowy typ.
Przypuszczam, że można by przyjąć, że ten cytat oznacza, że gdy prawy operand jest większy, operacja jest dostosowywana tak, aby była sensowna w kontekście liczb obciętych modulo.
to znaczy
0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF
w przeciwieństwie do używania semantyki ze znakiem zależnej od implementacji:
0x0000 - 0x0001 == (unsigned) (0 + -1) == (0xFFFF ale także 0xFFFE lub 0x8001)
Która lub jaka interpretacja jest właściwa? Czy to w ogóle jest zdefiniowane?