2013-05-17 12 views
7

Do C e C++ garantiscono che l'equivalente senza segno di un tipo abbia la stessa dimensione?La parola chiave unsigned ha effetto sul risultato di sizeof?

Esempio:

size_t size = sizeof(unsigned int); 

È il unsigned completamente discutibile qui?

+3

Anche se è ridondante, penso che sia consigliabile usare 'sizeof (unsigned int)' se si tratta di spazio per 'unsigned int' per evitare confusione. – zch

+2

In termini di psicologia: vuoi la dimensione di X (qualunque sia la X) - Quindi, sii esplicito.Quindi programmando avrai sempre ragione qualunque sia X - (unsigned int, class Cabbage ...) –

+0

Sarei stupito se sizeof (int) non fosse uguale a sizeof (unsigned). Raccomando fiducia-ma-verifica. – matthudson

risposta

14

Entrambe le lingue garantiscono che le varianti firmate e non firmate di un tipo intero standard corrispondente abbiano la stessa dimensione.

C++, comitato progetti n3337, 3.9.1/3:

3 per ciascuno dei tipi interi standard di firma, esiste una corrispondente (ma differente) Standard non- tipo intero con segno: “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 numero intero con segno corrispondente 45; cioè, ogni intero intero con segno di tipo ha la stessa rappresentazione dell'oggetto del corrispondente tipo di intero senza segno. [...]

Per C, il testo è molto simile

Tratto da progetti di n1570, 6.2.5/6:

Per ciascuno dei tipi interi firmati, non v'è un corrispondente (ma diverso) tipo intero senza segno (designato con la parola chiave non firmata) che utilizza la stessa quantità di memoria (comprese le informazioni sul segno) e ha gli stessi requisiti di allineamento. Il tipo _Bool e i tipi di numeri interi senza segno che corrispondono al numero intero con segno standard sono i tipi di numeri interi senza segno standard. I tipi di interi senza segno che corrispondono ai tipi di intero con segno esteso sono i tipi di interi senza segno esteso. I tipi interi senza segno standard e esteso sono chiamati collettivamente numeri interi senza segno .

+0

Ottima risposta, bello vedere una citazione vera e propria. –

+0

Il "sì" iniziale nella risposta è confuso poiché OP ha formulato la domanda oggetto e la prima riga del corpo della domanda al contrario. :-) –

+0

Sono d'accordo @R. Meglio ora? – jrok

2

Non è davvero obsoleto, è più ridondante. Lo standard garantisce che le varianti firmate e non firmate di un tipo abbiano le stesse dimensioni.

0

Si può sempre mettere in qualche codice come questo

{ 
char s1[1 + sizeof(int) - sizeof(unsigned int)]; 
char s2[1 + sizeof(unsigned int) - sizeof(int)]; 
} 

(probabilmente solo nel build di debug)

Questo vi darà un errore di compilazione se fossero sempre diverse dimensioni.

Lo faccio occasionalmente per codice molto (typedef) ed sto refactoring.

Ma le varietà non firmate e firmate hanno sempre le stesse dimensioni.

+0

'assert (sizeof (signed int) == sizeof (unsigned int))' compie lo stesso con una maggiore leggibilità. –

+0

Ma non si tratta di un errore in fase di esecuzione? Voglio bloccare la compilazione! – Bathsheba

+0

Per C++ 11 è possibile utilizzare ['std :: static_assert (sizeof (signed int) == sizeof (unsigned int)," size mismatch ");'] (http://en.cppreference.com/w/ cpp/lingua/static_assert) per ottenere un errore in fase di compilazione. –

Problemi correlati