2011-12-03 16 views
5
#include <iostream> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 

    int num=-2147483648; 
    int positivenum=-num; 
    int absval=abs(num); 

    std::cout<<positivenum<<"\n"; 
    std::cout<<absval<<"\n"; 

    return 0; 
} 

Hola estoy bastante curiosidad por qué la salida del código anterior es¿No es posible la negación de -2147483648 en C/C++?

-2147483648 
-2147483648 

Ahora conozco que -2147483648 es el número más pequeño entre represntable enteros con signo, (suponiendo un int es de 32 bits). Hubiera supuesto que uno obtendría respuestas basura solo después de que bajáramos por debajo de este número. Pero en este caso, +2147483648 está cubierto por el sistema de enteros de 32 bits. Entonces, ¿por qué la respuesta negativa en ambos casos?

+0

Use _int64 en lugar de int y vuelva a intentarlo. – jmucchiello

Respuesta

15

Pero en este caso, +2147483648 está cubierto por el sistema de enteros de 32 bits.

No del todo correcto. Solo sube a +2147483647. Entonces su suposición no es correcta.

Negating -2147483648 de hecho producirá 2147483648, pero rebosará de nuevo a -2147483648.

Además, el desbordamiento de entero con signo es un comportamiento técnicamente indefinido.

7

El valor - (- 2147483648) es no posible en int de 32 bits. El rango de int firmado de 32 bits es -2147483648 a 2147483647

+0

maldición Yo iba a responder, pero +1 – tekknolagi

2

Ahhh, pero no es ... 0 recordar, más grande es en realidad firmado 2147483647

1

Debido a la representación en complemento a 2 de enteros con signo no es simétrica y el mínimo entero de 32 bits se -2147483648 mientras que el máximo es +2147483647. Ese -2147483648 es su propia contrapartida igual que 0 (en la representación del complemento de 2 hay solo un 0, no hay +0 ni -0).

Aquí hay algunas explicaciones.

Un número negativo -X cuando se representa como complemento de N-bit 2, se representa efectivamente como número sin signo que es igual a 2 N -X. Así, por enteros de 32 bits:
si X = 1, entonces X = 2 -1 = 4294967295
si X = 2147483647, entonces -X = 2 -2147483647 = 2147483649
si X = 2147483648, entonces -X = 2 - 2147483648 = 2147483648
si X = -2147483648, entonces -X = 2 + 2147483648 = 2147483648 (porque sólo mantener bajos 32 bits)

Así, -2147483648 = +2147483648. Bienvenido al mundo de los valores del complemento de 2.