-2147483648 jest najmniejszą liczbą całkowitą dla typu liczb całkowitych z 32 bitami, ale wydaje się, że przepełni się w if(...)
zdaniu:
if (-2147483648 > 0)
std::cout << "true";
else
std::cout << "false";
Zostanie to wydrukowane true
podczas moich testów. Jeśli jednak użyjemy -2147483648 na liczbę całkowitą, wynik będzie inny:
if (int(-2147483648) > 0)
std::cout << "true";
else
std::cout << "false";
To zostanie wydrukowane false
.
Jestem zmieszany. Czy ktoś może wyjaśnić to?
Aktualizacja 02-05-2012:
Dzięki za komentarze, w moim kompilatorze rozmiar int to 4 bajty. Używam VC do prostych testów. Zmieniłem opis w moim pytaniu.
To wiele bardzo dobrych odpowiedzi w tym poście, AndreyT udzielił bardzo szczegółowego wyjaśnienia, w jaki sposób kompilator będzie zachowywał się na takich danych wejściowych i jak zaimplementowano tę minimalną liczbę całkowitą. Z drugiej strony qPCR4vir dał pewne powiązane „osobliwości” i sposób reprezentowania liczby całkowitej. Tak imponujące!
INT_MIN
z -9223372036854775808
, jeśli CHAR_BIT
jest 16. A nawet CHAR_BIT == 8
i sizeof(int
== 4) `może pojawić się -9223372036854775807
, ponieważ C nie wymagają 2-Uzupełnienia liczb.