2013-04-12 18 views
12

Supponiamolong long è 8 byte, ma ottengo un overflow intero?

long long b = 5*1024*1024*1024; // 5 gigs, small enough for 64 bits 
    printf ("%lu\n",sizeof(long long)); // prints 8 (bytes) = 64 bits 

ma il compilatore si lamenta:

warning: integer overflow in expression [-Woverflow] 

Perché è troppo pieno, cosa mi manca?

risposta

19

Poiché i numeri sul lato destro sono di tipo int, non long long, così int aritmetica viene eseguita nell'espressione, portando ad un overflow.

Se aggiungi LL a uno di essi, li promuoverà tutti.

+0

maledizione, hai ragione. Si pensa sempre di aggiungere f o (lanciare) float ... ma non si allunga mai :(Apprezzalo –

+0

@DervinThunk - è facile dimenticare con costanti – teppic

+0

Più precisamente, le costanti sono di tipo 'int' (" intero "è un termine più generale, che copre ogni cosa da 'char' a' long long' e possibilmente di più) E se applichi 'LL' alla destra' 1024', potresti comunque ottenere un overflow, dato '5 * 1024 * 1024 * 1024LL', '5 * 1024 * 1024' viene ancora valutato come' int' - che può essere legalmente stretto come 16 bit. La soluzione più affidabile è probabilmente scrivere '5LL * 1024LL * 1024LL * 1024LL' - o '5LL * (1LL << 30)'. –

Problemi correlati