2012-02-29 8 views
5

W moim przypadku iloczyn dwóch numerów INT_MAX to 296447233, co jest nieprawidłowe.Nieprawidłowy produkt z dwoma numerami INT_MAX w C/C++

long long int product = 0; 
product = 2137483647 * 2137483647; 
printf("product: %lli\n", product); 

Co robię źle, i jak to poprawić? Dzięki!

+2

Um. ..INT_MAX to 2147483647 (dla 32-bi t ints). Jesteś nieśmiały przez 10000000. –

+0

O, nie !!!!!! Ye, mam błąd INT_MAX. Dzięki za wskazanie tego! – newprint

Odpowiedz

14

Oba twoje 2137483647 są typu int. Pozostają tego typu i przepełniają.

Dodać do nich long long s:

product = 2137483647LL * 2137483647LL; 

lub odlewane:

product = (long long)2137483647 * 2137483647; 
+0

Więc, w zasadzie, produkt dwóch ints właśnie przepełnienia, mimo że przypisuję go do długiego int int? Dziękuję za odpowiedź ! – newprint

+4

Prawidłowo. W twoim przykładzie konwersja dzieje się * po * pomnożeniu. Tak więc przepełnia się, zanim zostanie awansowana na 'long long'. – Mysticial

+1

Kompilator potraktuje te dwie liczby jako ints, wykona obliczenia matematyczne, a następnie pomyśli o umieszczeniu wartości w "produkcie". –

6

Spróbuj

product = 2137483647LL * 2137483647LL; 

aby upewnić się, że podczas kompilacji traktuje numery tak długo, długie

+0

Och i ja + 1'ed dla wskazał "LL". – Mysticial