2013-05-17 8 views
7

Gewährleisten C und C++, dass das vorzeichenlose Äquivalent eines Typs die gleiche Größe hat?Wirkt sich das unsignierte Schlüsselwort auf das Ergebnis von sizeof aus?

Beispiel:

size_t size = sizeof(unsigned int); 

Ist unsigned völlig gegenstandslos hier?

+3

Während es redundant ist, denke ich, es ist zu empfehlen, "sizeof (unsigned int)" zu verwenden, wenn es um Platz für 'unsigned int' geht, um Verwirrung zu vermeiden. – zch

+2

In Bezug auf Psychologie - Sie wollen die Größe von X (was auch immer X ist) - Also sei nur explizit.Dann programmieren Sie immer, was auch immer X ist - (unsigned int, Klasse Cabbage ...) –

+0

Ich wäre erstaunt, wenn sizeof (int) jemals nicht gleich groupof (unsigned) wäre. Ich empfehle Vertrauen, aber verifizieren. – matthudson

Antwort

14

Beide Sprachen garantieren, dass vorzeichenbehaftete und vorzeichenlose Varianten eines entsprechenden Standard-Integer-Typs die gleiche Größe haben.

C++, Committee Draft n3337, 3.9.1/3:

3 Für jede der Standard-Integer-Typen signiert, existiert einen entsprechenden (jedoch unterschiedlichen) -Standard un- Integer-Typen signiert: „unsigned char "," unsigned short int "," unsigned int "," unsigned long int ", und" unsigned long long int ", , von denen jede die gleiche Menge an Speicherplatz belegt und die gleichen Ausrichtung Anforderungen (3.11) als die entsprechende vorzeichenbehaftete Ganzzahl type45; das heißt, jeder vorzeichenbehaftete ganzzahlige Typ hat die gleiche Objektdarstellung wie sein entsprechender vorzeichenloser Integertyp. [...]

Für C ist die Formulierung sehr ähnlich

von Entwurf n1570 Genommen 6.2.5/6:

Für jede der signierten Integer-Typen gibt es ein entsprechender (aber anderer) unsignierter Integer-Typ (mit dem Schlüsselwort unsigned gekennzeichnet) , der die gleiche Menge an Speicher (einschließlich Vorzeicheninformationen) verwendet und dieselben Ausrichtungsanforderungen hat. Der Typ _Bool und die vorzeichenlosen ganzzahligen Typen, die den vorzeichenbehafteten ganzzahligen Ganzzahlentypen entsprechen, sind die standardmäßigen Ganzzahlarten ohne Vorzeichen. Die vorzeichenlosen Integer-Typen, die den erweiterten Ganzzahl-Typen mit Vorzeichen entsprechen, sind die erweiterten vorzeichenlosen Integer-Typen. Die standardmäßigen und erweiterten vorzeichenlosen Integer-Typen werden zusammen als vorzeichenlose Integer-Typen bezeichnet.

+0

Ausgezeichnete Antwort, schön, ein tatsächliches Zitat zu sehen. –

+0

Das anfängliche "Ja" in Ihrer Antwort ist verwirrend, da OP das Fragethema und die erste Zeile des Fragetextes in umgekehrter Reihenfolge formuliert hat. :-) –

+0

Ich stimme @R zu. Besser jetzt? – jrok

2

Es ist nicht wirklich veraltet, mehr wie überflüssig. Der Standard garantiert signierte und unsignierte Varianten eines Typs, die dieselbe Größe haben.

0

Sie immer in einigen Code setzen könnte wie dieses

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

(wahrscheinlich nur in Debug-Builds)

Dies gibt Ihnen eine Kompilierung Fehler, wenn sie jemals verschiedenen Größen waren.

Ich mache dies gelegentlich für hoch (typedef) ed Code Ich refaktorieren.

Aber nicht signierte und signierte Sorten haben immer die gleiche Größe.

+0

'Assert (sizeof (vorzeichenbehaftet int) == sizeof (vorzeichenlose int)) erreicht das gleiche mit größerer Lesbarkeit. –

+0

Aber ist das nicht ein Laufzeitfehler? Ich möchte die Kompilierung blockieren! – Bathsheba

+0

Für C++ 11 können Sie ['std :: static_assert (sizeof (vorzeichenbehaftet int) == sizeof (unsigned int)," Größe nicht übereinstimmen ");'] (http://en.cppreference.com/w/ cpp/language/static_assert), um einen Kompilierzeitfehler zu erhalten. –