2011-12-03 7 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; 
} 

Hi Jestem całkiem ciekawy dlaczego wyjście powyżej kod jestNegacja -2147483648 nie jest możliwa w C/C++?

-2147483648 
-2147483648 

Teraz wiem, że -2147483648 jest najmniejsza liczba represntable wśród podpisanych wskazówki, (zakładając int wynosi 32 bity). Założę się, że odpowiedzi na śmieci można uzyskać dopiero po przekroczeniu tego numeru. Ale w tym przypadku +2147483648 IS jest objęty 32-bitowym systemem liczb całkowitych. Dlaczego więc negatywna odpowiedź w obu przypadkach?

+0

Użyj _int64 zamiast int i spróbuj ponownie. – jmucchiello

Odpowiedz

15

Ale w tym przypadku +2147483648 IS jest objęty 32-bitowym systemem liczb całkowitych.

Nie do końca poprawne. To tylko idzie do +2147483647. Twoje założenie jest niewłaściwe.

Negacja -2147483648 rzeczywiście wyprodukuje 2147483648, ale zostanie przelana z powrotem na -2147483648.

Co więcej, podpisane całkowite przepełnienie jest technicznie niezdefiniowanym zachowaniem.

7

Wartość - (- 2147483648) to nie możliwe w wersji 32-bitowej z int. Zakres podpisanej intencji 32-bitowej to -2147483648 do 2147483647

+0

Chciałbym odpowiedzieć, ale +1 – tekknolagi

2

Ahhh, ale jej nie pamiętam ... 0, największy podpisany jest rzeczywiście 2147483647

1

ponieważ 2 jest uzupełnieniem reprezentacja podpisanych liczb nie jest symetryczny, a minimalna 32-bitowa liczba całkowita jest -2147483648 natomiast maksymalna to +2147483647. Ten -2147483648 jest jego własnym odpowiednikiem, tak jak 0 (w uzupełnieniu 2 jest tylko jedno 0, nie ma wyraźnych +0 i -0).

Oto kilka wyjaśnień.

Liczba ujemna -X, gdy jest reprezentowana jako dopełnienie N-bit 2, jest skutecznie reprezentowana jako liczba bez znaku, która jest równa 2 N -X. Zatem, dla 32-bitowych liczb całkowitych
Jeżeli X = 1, a X = 2 - 1 = 4294967295
jeśli X = 2147483647, a X = 2 - 2147483647 = 2147483649
jeśli X = 2147483648, a X = 2 - 2147483648 = 2147483648
jeśli X = -2147483648, a X = 2 + = 2147483648 2147483648 (bo tylko utrzymać niskie 32 bitów)

zatem -2147483648 = +2147483648. Witaj w świecie wartości uzupełniających 2.

Powiązane problemy