Mi sono imbattuto nel codice di qualcuno che sembra credere che ci sia un problema durante la sottrazione di un numero intero senza segno da un altro intero dello stesso tipo quando il risultato sarebbe negativo. Quindi quel codice come questo non sarebbe corretto anche se dovesse funzionare sulla maggior parte delle architetture.
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
Questa è l'unica citazione vagamente rilevante dallo standard C che sono riuscito a trovare.
Un calcolo che coinvolge operandi senza segno non può mai superare il flusso, perché un risultato che non può essere rappresentato dal tipo intero senza segno risultante viene ridotto modulo il numero che è maggiore di uno rispetto al valore più grande che può essere rappresentato dal tipo risultante.
Suppongo che si possa prendere quella citazione per significare che quando l'operando destro è più grande l'operazione viene regolata per essere significativa nel contesto dei numeri troncati del modulo.
cioè
0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF
invece di usare la semantica firmata dipendente dall'implementazione:
0x0000 - 0x0001 == (senza segno) (0 + -1) == (0xFFFF ma anche 0xFFFE o 0x8001)
Quale o quale interpretazione è giusta? È definito del tutto?