Me encontré con el código de alguien que parece creer que hay un problema al restar un entero sin signo de otro entero del mismo tipo cuando el resultado sería negativo. Entonces, ese código como este sería incorrecto incluso si funciona en la mayoría de las arquitecturas.
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
Esta es la única cita vagamente relevante del estándar C que pude encontrar.
Un cálculo que involucre operandos sin signo nunca puede desbordarse, porque un resultado que no puede ser representado por el tipo entero sin signo resultante se reduce módulo al número que es uno mayor que el valor más grande que puede ser representado por el tipo resultante.
Supongo que se podría tomar esa cita en el sentido de que cuando el operando derecho es más grande, la operación se ajusta para que sea significativa en el contexto de números truncados de módulo.
es decir
0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF
en lugar de utilizar la semántica firmada dependiente de la implementación:
0x0000 - 0x0001 == (sin firmar) (0 + -1) == (0xFFFF pero también 0xFFFE o 0x8001)
¿Cuál o qué interpretación es la correcta? ¿Está definido en absoluto?