Encontrei o código de alguém que parece acreditar que há um problema ao subtrair um inteiro sem sinal de outro inteiro do mesmo tipo quando o resultado seria negativo. Portanto, esse código como este estaria incorreto mesmo se funcionar na maioria das arquiteturas.
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
Esta é a única citação vagamente relevante do padrão C que pude encontrar.
Um cálculo envolvendo operandos sem sinal nunca pode transbordar, porque um resultado que não pode ser representado pelo tipo inteiro sem sinal resultante é o módulo reduzido do número que é um maior que o maior valor que pode ser representado pelo tipo resultante.
Suponho que essa citação possa significar que, quando o operando certo é maior, a operação é ajustada para ser significativa no contexto de números de módulo truncados.
ie
0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF
ao contrário de usar a semântica assinada dependente da implementação:
0x0000 - 0x0001 == (sem sinal) (0 + -1) == (0xFFFF mas também 0xFFFE ou 0x8001)
Qual ou qual interpretação está certa? Está definido de alguma forma?