2013-03-26 18 views
6

Jestem zaskoczony na tym fragmencie kodu:dlaczego w tym mnożeniu występuje przepełnienie liczby całkowitej?

#include <climits> 
#include <iostream> 
int main(void) { 
    using namespace std; 
    cout << "long max " << LONG_MAX << endl; 
    long x = 2 * 1024 * 1024 * 1024; 
    cout << "2 * 1024 * 1024 * 1024 = " << x << endl; 
    return 0; 
} 

Spodziewałem , jak powinno być, zamiast ja dostaję. Używanie unsigned nie wydaje się pomóc. co daje?

long max 9223372036854775807 
2 * 1024 * 1024 * 1024 = -2147483648 
+0

jeśli wpiszesz '1024', to już ma typ danych, w tym języku jest liczbą całkowitą. Dlatego musisz podać '1024L', jeśli chcesz mieć długi typ danych. – eis

Odpowiedz

11

Dodaj niektóre L s *. long x = 2L * 1024L * 1024L * 1024L;

(technicznie, tak długo jak długo jest dosłownym typu long inne zostaną podniesione long)

Przelew tak, ponieważ 2 itp jest typu int domyślnie i przepełnienia stanie przed przydzial.

Zobacz integer literals, który wyjaśnia różne literały.

+1

A podpisana int ma maksymalnie '(2^31) - 1', więc' 2^31' przepełnia ją o jeden. (tylko po to, aby było bardziej kompletne). – scones

+0

Myliłem się, że upiór się tym zajmie, najwyraźniej nie. thx – Oliver

+0

@Oliver: Przepełnienie ma miejsce przed przypisaniem. Należy również zauważyć, że sygnalizowane przekroczenie liczby całkowitej jest niezdefiniowanym zachowaniem w C++. –

Powiązane problemy