2016-03-29 10 views
3

Verpflichtet C-Norm es? Gibt es eine Plattform, bei der die Anzahl der Bits in einem Byte nicht der Anzahl der Bits in einem Typ char entspricht?Ist die Anzahl der Bits in einem Byte gleich der Anzahl der Bits in einem Typ-Zeichen?

+0

Diese könnten auch von Interesse sein: http://StackOverflow.com/Questions/2098149/What-Platforms-Have-Something-other-than-8-bit-char und http://StackOverflow.com/questions/5516044/system-where-1-byte-8-bit (beantwortet die Frage nicht vollständig). – cdarke

+2

Wieder geöffnet. Diese Frage unterscheidet sich von den 8 Bits in einem Byte-Duplikat: Es geht nicht um etwas, was 8 Bits entspricht, sondern um etwas, das die gleiche Anzahl von Bits wie etwas anderes hat. – Bathsheba

+0

@cdarke: um klar zu sein, diese Frage ist nicht, was 'CHAR_BIT' Wert ist. Es geht darum, ob Sie * alle * Bits in einem Byte benötigen, um 'char' Werte darzustellen (keine Füllbits). – jfs

Antwort

3

Ja. Beide sind gleich CHAR_BIT*.

C-Standard definiert CHAR_BIT als: "Anzahl der Bits für das kleinste Objekt, das kein Bitfeld (Byte) ist". c99 sagt explizit: "Ein Byte enthält CHAR_BIT Bits."

"UCHAR_MAX gleich sind 2 CHAR_BIT-1" - es bedeutet unsigned char erfordert mindestensCHAR_BIT Bits (char_bits >= CHAR_BIT).

sizeof(char) == 1 (single-Byte-Zeichen paßt in einem Byte), das heißt, Typ char erfordert höchstensCHAR_BIT Bits (char_bits <= CHAR_BIT).

Von char_bits >= CHAR_BIT und char_bits <= CHAR_BIT folgt, dass char_bits == CHAR_BIT (keine Padding-Bits).

POSIX says it explicitly: "CHAR_BIT Anzahl der Bits in einem Typ char"


*: Wenn char unterzeichnet und CHAR_BIT > 8 dann (ohne die $6.2.6.2 Zitat unten) war es nicht klar, ob SCHAR_MIN..SCHAR_MAX Bereich alle CHAR_BIT Bits umfasst. Obwohl der Name CHAR_BIT die Absicht klar kommuniziert ("Anzahl der Bits in char").

c11 sagt ($6.2.6.2 in n1570 Entwurf): "signed char soll keine Füllbits haben. Es soll genau ein Vorzeichenbit sein."

Von $6.2.5.15:

Die Umsetzung wird char definieren den gleichen Bereich haben, Darstellung und das Verhalten entweder als signed char oder unsigned char

es folgen: Alle CHAR_BIT Bits verwendet werden, um repräsentieren CHAR_MIN..CHAR_MAX Bereich (weil beide signed und unsigned char Typ alle Bits verwenden).

Zum Vergleich, im Gegensatz zu char; _Bool kann wenige Bits verwenden $6.7.2.1.4(122):

Während die Anzahl der Bits in einem _Bool Objekt zumindest CHAR_BIT, die Breite (Anzahl von Vorzeichen und Wert-Bits) ein _Bool kann nur 1 Bit sein.

+1

Leider kann ich keine neue Antwort hinzufügen, da die Frage geschlossen ist, aber in der Tech-Übersicht für den C55x begraben: http://www.ti.com/lit/ug/spru393/spru393.pdf kann man das sehen Das System ist für Byte-Größen von 8-48 Bits konfigurierbar (einige 54x-Serien bieten keine 8-Bit, aber ich konnte keine öffentlichen Dokumente finden). Die "neuen" c99-kompatiblen Tools machen "CHAR_BIT == 8" und "sizeof char == 1", weil das der Standard sagt (na ja, "sizeof char" war per Definition immer 1), aber die Byte-Größe in der CPU ist in den meisten Fällen immer noch nicht 8 Bit, und dies wirkt sich auf den Speicher, den Sie zuweisen, und den Code, den Sie schreiben. –

+0

@NickBastin: Sie können jetzt Antwort hinzufügen. – jfs

+1

@NickBastin: ISO C erlaubt jeden Wert> = 8 für 'CHAR_BIT'. POSIX benötigt 'CHAR_BIT == 8'. Beide benötigen 'sizeof (char) == 1'. –

Verwandte Themen