2014-07-08 15 views
6

Ho un progetto in cui mi occupo di numeri grandi (ns-timestamp) che non rientrano in un numero intero. Voglio quindi usare per es. int64_t e sto attualmente scrivendo un caso di test (sì!).Definizione del valore intero grande

Per controllare il comportamento per gran numero, ho iniziato con qualcosa come

int64_t val = 2*std::numeric_limits<int>::max(); 
qDebug() << "long val" << val; 

che restituisce

long val -2 

(come se mi definisco val come int).

Ma se scrivo

int64_t val = std::numeric_limits<int>::max(); 
val *= 2; 
qDebug() << "long val" << val; 

ottengo

long val 4294967294 

che sembra corretto.

Quindi per me sembra che lo 2*max() sia prima memorizzato in un numero intero (troncato in questo passaggio) e quindi copiato su int64. Perché succede? Il compilatore sa che il risultato è di tipo int64 in modo che lo 2*max() si adatti direttamente.

risposta

5

Quindi per me è come se il 2*max() viene prima memorizzato in un numero intero (troncato in questa fase) e poi copiati nella int64

Questo è assolutamente corretto. In base alle specifiche del linguaggio, quando tutte le parti di un'espressione rientrano in un int, il calcolo viene eseguito in numeri interi. Nel tuo caso, sia 2 sia max() rientrano in un int, quindi la moltiplicazione viene eseguita in numeri interi, causando un overflow.

il compilatore sa che il risultato è di tipo int64 in modo che il 2*max() dovrebbe andare bene direttamente.

Il risultato a cui viene assegnata un'espressione non ha importanza in questa situazione: l'espressione stessa indica il modo in cui viene calcolata. È possibile ottenere lo stesso risultato sostituendo max() a int64:

int64_t val = 2*(int64_t)std::numeric_limits<int>::max(); 
Problemi correlati