Comprobación de desbordamiento en suma firmada y grupos abelianos
Estaba leyendo sobre por qué el siguiente código tiene errores:
int tadd_ok ( int x, int y ) {
int sum = x + y;
return ( sum - x == y ) && ( sum - y == x );
}
La explicación fue que la adición del complemento a dos forma un grupo abeliano y, por lo tanto, la expresión(x + y) - x
con evaluar ay
independientemente de si la adición se desborda o no.
(Igual por(x + y) - y)
que evaluará ax
)
No entiendo esta explicación o la referencia del grupo abeliano. La adición del complemento a dos es básicamente un módulo aritmético sin signo que se "convierte" en complemento a dos, ¿verdad?
Entonces, por ejemplo, si tenemos 4 bits, tenemos el rango [-8, 7].
En el ejemplo si tuviéramosx = 7
yy = 6
el resultado se desborda a 6. Y eso tampoco es igual ay
ox
.
Entonces, ¿por qué la explicación es que la igualdad siempre es válida independientemente del desbordamiento?