2012-11-01 14 views
23

La dimensione di char, int, long double ... può variare da un compilatore all'altro. Ma ho la garanzia secondo lo standard C++ 11 o C11 che la dimensione di ogni tipo di integrale fondamentale firmato e non firmato è la stessa?Ho la garanzia che sizeof (type) == sizeof (tipo senza segno)?

+0

Dovrei sperarlo, a meno che non sia in qualche modo un tipo per il quale la disuguaglianza abbia un senso, nel qual caso sarei lieto di sentirlo. – chris

+1

Come da parte, sizeof char è sempre 1. char può avere una dimensione insolita, come 16 bit, ma la dimensione di char sarebbe ancora 1 e la dimensione di un tipo a 32 bit sarebbe 2. –

risposta

40

Il C++ 11 dice standard sui tipi interi:

(§3.9.1/3) per ciascuno dei tipi interi standard di firma, esiste una corrispondente (ma differente) tipo intero senza segno norma : "Unsigned char", "unsigned short int", "unsigned int", "unsigned long int" e "unsigned long long int", ognuno dei quali occupa la stessa quantità di memoria e ha gli stessi requisiti di allineamento (3.11) come il tipo intero con segno corrispondente; cioè, ogni tipo di intero con segno ha la stessa rappresentazione dell'oggetto del corrispondente tipo di intero senza segno. Allo stesso modo, per ognuno dei tipi interi con segno esteso esiste un corrispondente tipo intero senza segno esteso con la stessa quantità di requisiti di archiviazione e allineamento. [...]

Quindi la risposta è sì.

Per C11, v'è una dichiarazione corrispondente here (questo è da N1570):

(§6.2.5/6) Per ciascuno dei tipi interi firmati, v'è un corrispondente (ma differente) unsigned tipo intero (indicato con la parola chiave non firmato), che utilizza la stessa quantità di memorizzazione (incluse le informazioni segno) ed ha gli stessi requisiti di allineamento [...]

-1

Sì, c'è una garanzia completa che sizeof (tipo firmato) è uguale a sizeof (tipo senza segno) poiché unsigned prende solo lo spazio dei numeri negativi di tipo firmato per aumentare il proprio intervallo.

+1

Nulla nello standard richiede che 'UINT_MAX > INT_MAX'; le macchine di grande importanza possono renderle uguali. – supercat