2012-06-08 14 views
11

Supongamos que hay dos enteros (int x, y;).
x es negativo y y = 0x80000000.¿Resta sin desbordamiento?

¿Por qué no se desborda (x - y) mientras x + (-y) hace?
¿La computadora no resta por adición?

+0

¿Cómo lo sabes? – lindelof

+0

"Sistemas informáticos, una perspectiva de programador" Solución al problema 2.32 (página 87) "... tendremos -y también igual a TMin, por lo que la función tadd_ok considerará que hay desbordamiento negativo en cualquier momento x es negativo. de hecho, xy no se desborda en estos casos ... " – Yuu

Respuesta

8

Para responder a su primera pregunta, 0x80000000 (-2,147,483,648) representa el valor mínimo de 32 bits para los enteros con signo. 2,147,483,647 es el valor máximo. La magnitud del valor máximo es uno menos que la magnitud del valor mínimo cuando se almacena usando Two's Complement. No se puede representar tomando (-y) solo ya que excede el valor máximo (en 1). El valor entero final de (x-y) está dentro del rango (dado que x es negativo) y se puede representar mediante un entero de 32 bits.

Para responder a su segunda pregunta, la resta se logra al convertir el número que se restará en su valor aditivo inverso. Dado el potencial de desbordamiento en esta situación, su compilador puede obtener el resultado correcto para (x-y) haciendo -((-x)+y). Sin embargo, esto es pura especulación (es la única forma en que se me ocurre hacerlo de manera segura).