Ich bin auf Code von jemandem gestoßen, der zu glauben scheint, dass es ein Problem gibt, eine vorzeichenlose Ganzzahl von einer anderen Ganzzahl des gleichen Typs zu subtrahieren, wenn das Ergebnis negativ wäre. Dieser Code wäre also falsch, selbst wenn er auf den meisten Architekturen funktioniert.
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
Dies ist das einzige vage relevante Zitat aus dem C-Standard, das ich finden konnte.
Eine Berechnung mit vorzeichenlosen Operanden kann niemals überlaufen, da ein Ergebnis, das nicht durch den resultierenden vorzeichenlosen Ganzzahltyp dargestellt werden kann, modulo um die Zahl reduziert wird, die eins größer ist als der größte Wert, der durch den resultierenden Typ dargestellt werden kann.
Ich nehme an, man könnte dieses Zitat so verstehen, dass wenn der richtige Operand größer ist, die Operation so angepasst wird, dass sie im Kontext von Modulo-abgeschnittenen Zahlen sinnvoll ist.
dh
0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF
im Gegensatz zur Verwendung der implementierungsabhängigen vorzeichenbehafteten Semantik:
0x0000 - 0x0001 == (ohne Vorzeichen) (0 + -1) == (0xFFFF, aber auch 0xFFFE oder 0x8001)
Welche oder welche Interpretation ist richtig? Ist es überhaupt definiert?