2013-04-12 15 views

Odpowiedz

19

Ponieważ liczby po prawej stronie są typu int, a nie long long, więc arytmetyka jest wykonywana w wyrażeniu, co prowadzi do przepełnienia.

Jeśli dodasz LL do jednego z nich, będzie promować je wszystkie.

+0

Cholera, masz rację. Zawsze myśli się o dołączaniu f lub (rzucaniu) pływaków ... ale nigdy nie tęskni :(Doceń to. –

+0

@DervinThunk - łatwo jest zapomnieć o stałych – teppic

+0

Dokładniej, stałe są typu 'int' (" integer "jest bardziej ogólny termin, obejmujący wszystko od 'char' do' long long' i prawdopodobnie więcej) i jeśli zastosujesz 'LL' do najbardziej prawicowego' 1024', nadal możesz uzyskać przepełnienie, biorąc pod uwagę '5 * 1024 * 1024 * 1024LL', '5 * 1024 * 1024' jest nadal oceniane jako' int' - które może legalnie być tak wąskie, jak 16 bitów. Najbardziej niezawodnym rozwiązaniem jest prawdopodobnie napisanie '5LL * 1024LL * 1024LL * 1024LL' - lub '5LL * (1LL << 30)'. –