2016-05-19 13 views
6

Ecco il mio codicegcc "troppo pieno nell'espressione" mentre l'espressione equivalente equivalente funziona bene

#include <iostream> 
static const unsigned long long int xx = (36 * 36 * 36 * 36) * (36 * 36 * 36 * 36); 
static const unsigned long long int y = 36 * 36 * 36 * 36; 
static const unsigned long long int yy = y * y; 

int main() 
{ 
    std::cout << xx << std::endl; 
    std::cout << yy << std::endl; 
    return 0; 
} 

Questa uscita la compilation

# g++ -std=c++11 test.cpp -o test 
test.cpp:2:62: warning: integer overflow in expression [-Woverflow] 
static const unsigned long long int xx = (36 * 36 * 36 * 36) * (36 * 36 * 36 * 36); 

Questa è l'uscita di esecuzione

# ./test 
18446744073025945600 
2821109907456 

Can spieghi perché vedo questo avviso e risultati diversi? se 36 può essere inserito in char, allora 36^8 può essere inserito in unsigned long long int quindi non sono sicuro di quale sia il problema qui, si prega di avvisare. (Sto usando gcc 4.9.2)

+0

Questo sembra essere un malinteso molto comune: che un intento successivo influenza in qualche modo il significato del codice precedente. (Dove "precedente" e "successivo" si riferiscono all'ordinamento dell'inclusione subexpression.) In genere non è il caso in C++; il più vicino a un effetto simile è la risoluzione del sovraccarico sugli operandi di indirizzo all'interno di un cast. –

risposta

10
static const unsigned long long int xx = (36 * 36 * 36 * 36) * (36 * 36 * 36 * 36); 

36 è digitare int

36 * 36 è di tipo int

(36 * 36 * 36 * 36) è di tipo int

(36 * 36 * 36 * 36) * (36 * 36 * 36 * 36) è di tipo int e overflow , che è in realtà un comportamento indefinito per i tipi firmati.

Probabilmente voleva

static const unsigned long long int xx = (36ull * 36 * 36 * 36) * (36 * 36 * 36 * 36); 

Per quanto riguarda il secondo caso:

static const unsigned long long int yy = y * y; 

y è di tipo unsigned long long

y * y è di tipo unsigned long long quindi non c'è troppo pieno.

+1

Typo: comportamento non definito per tipi non firmati: si intendeva firmare, giusto? – Rostislav

+0

@Rostislav Ahem ... grazie: D – user657267