Il seguente è il modo standard (ISO 14882) spiega abort -1> sizeof (int)
relazionale operatore `>' è definito in 5.9 (expr.rel/2)
I normali conversioni aritmetiche vengono eseguite su operandi dell'aritmetica o tipo enumerazione. ...
I normali conversioni aritmetiche è definita 5 (espressione/9)
... Il modello si chiama le conversioni aritmetiche abituali, che sono definite come segue:
- Se uno degli operandi è di tipo lungo doppia, ...
- Altrimenti, se uno degli operandi è dobule, ...
- Altrimenti, se uno degli operandi è float, ...
- In caso contrario, le promozioni integrali devono essere eseguite su entrambi gli operandi.
- ...
Le promozioni integrali è definito in 4.5 (conv.prom/1)
Un rvalue di tipo char, char firmato, char, short int o unsigned breve int può essere convertito in un rvalue di tipo int se int può rappresentare tutti i valori di il tipo di sorgente ; in caso contrario, il valore di origine può essere convertito in in un valore di tipo int unsigned.
Il risultato di sizeof è definito in 5.3.3 (expr.sizeof/6)
Il risultato è una costante di tipo size_t
size_t è definito nella norma C (ISO 9899), che è il tipo intero senza segno .
Quindi per -1 > sizeof(int)
, il> attiva le normali conversioni aritmetiche. La normale conversione aritmetica converte -1 in unsigned int perché int non può rappresentare tutto il valore di size_t
. -1
diventa un numero molto grande dipende dalla piattaforma. Quindi -1 > sizeof(int)
è true
.
Potrebbe essere solo un errore di battitura, ma 'size_t' è un tipo intero non firmato _an_ e non deve essere il caso che' int' non possa rappresentare tutti i valori di 'size_t' (' size_t' potrebbe essere 'unsigned short '), anche se ovviamente non è possibile sulla piattaforma del richiedente. –
'(unsigned T) -1' non è solo un grande valore, è * il * valore più grande' unsigned T' può contenere. – GManNickG
Sono ben consapevole di ciò che lo standard consente. :) -1 è sempre il più grande, leggi le regole di conversione. Oppure questo http://stackoverflow.com/questions/809227/is-it-safe-to-use-1-to-set-all-bits-to-true/809341#809341 – GManNickG