2014-11-21 22 views
5

Perché 1 non è maggiore di -0x80000000. So che ha qualcosa a che fare con l'overflow. Ma qualcuno può spiegare perché? 0x80000000 non è una costante penso che sia?Perché 1 non è maggiore di -0x80000000

assert(1 > -0x80000000); 

I trigger di asserzione in C++. Perché?


Sono grato per alcune delle risposte fornite. Ma lo standard C++ definisce che la costante deve essere memorizzata in un numero intero a 32 bit? Perché il compilatore non ha riconosciuto che 80000000 non è adatto per un numero intero a 32 bit e utilizza 64 bit per questo? Voglio dire, il più grande int a 32 bit può essere 0x7FFFFFFF. 0x80000000 è ovviamente più grande di quello. Perché il compilatore usa ancora 32 bit per quello?

+12

Quale valore pensi che '-0x80000000' rappresenti effettivamente? –

+4

Gli odori come i compiti. –

+0

Poiché i '' non firmati 'hanno 32 bit di valore. – Deduplicator

risposta

11

In base agli standard C e C++, -0x80000000 non è una costante intera. È un'espressione, come 3 + 5. In questo caso, è la costante 0x80000000, gestita dall'operatore di negazione. Per i compilatori che dispongono di 32 bit int s, 0x80000000 non è rappresentabile come int, ma è rappresentabile come unsigned int. Ma negare un intero senza segno è (stranamente) fatto in un contesto non firmato. Quindi la negazione qui non ha alcun effetto.

+0

Perché viene convertito in un 'unsigned int'? – vsoftco

+0

Quindi non capisco. Sulla mia macchina, 'int' ha 64 bit, quindi abbastanza spazio per rappresentare' -0x80000000'. Come viene interpretata questa espressione? I.e., che tipo è promosso a? Se lo getto a '(int)' allora va bene, visualizza '-2147483648', il valore che rappresenta. – vsoftco

+1

@vsoftco Anche se il tuo processore sembra essere a 64 bit, è estremamente improbabile che il tuo compilatore abbia 'int' s a 64 bit. – Sneftel

0

Un modo per risolvere questo problema è quello di utilizzare un tipo che si sa che è probabile che sia in grado di rappresentare e mantenere il vostro valore in modo corretto, il che significa che la vostra espressione può essere risolto in questo modo

assert(1 > -0x80000000L); 

o

assert(1 > -0x80000000LL); 

che è fondamentalmente sull'utilizzo di suffisso standard C++ per il vostro presunto intero espressione.

L'unica 3 suffisso standard per tipi interi in C++ sono u, l e ll, insieme con le variazioni maiuscole che hanno lo stesso significato come la loro controparte minuscolo; U, L e LL.

Problemi correlati