Gibt es Maschinen, wo sizeof (char)! = 1 oder zumindest CHAR_BIT> 8?
Frage
Gibt es Maschinen (oder Compiler), wo sizeof(char) != 1
?
Does C99-Standard sagt, dass sizeof(char)
auf Standard-Compliance-Implementierung 1 genau sein muss? Ist dies der Fall, bitte, geben Sie mir Abschnittsnummer und Zitat.
Update:
Wenn ich eine Maschine (CPU) haben, die nicht Bytes (minimale Lese ist 4 Bytes, ausgerichtet) adressieren kann, aber nur 4-s von Bytes (uint32_t
), kann für diese Maschine Compiler sizeof(char)
bis 4 definieren? sizeof(char)
1 sein wird, aber char werden 32 Bits (CHAR_BIT
Makros)
Update2: Aber sizeof Ergebnis ist kein BYTES! es ist die Größe von CHAR. Und char können 2 Byte sein, oder (möglicherweise) 7 Bit?
Update3:
Okay. Alle Maschinen verfügen über sizeof(char) == 1
. Aber was Maschinen haben CHAR_BIT > 8
?
Lösung
Es ist immer ein in C99, Abschnitt 6.5.3.4:
Wenn auf einen Operanden angewendet, hat Typ char, unsigned char oder unterzeichnet char (oder eine qualifizierte Version davon) das Ergebnis ist 1.
Edit: nicht Teil Ihrer Frage, aber für Interesse von Harbison und Steele, 3. Aufl. (Pre C99) p. 148:
Eine Speichereinheit wird als die sein, Speichermenge von einem besetzten Charakter; die Größe eines Objekts von Typ
char
ist daher 1.
Edit: In Antwort auf Ihre Frage aktualisiert, die folgende Frage und Antwort von Harbison und Steele ist relevant (ebenda, Ex 4 von Ch. 6.):
Ist es zulässig, eine C haben Implementierung, in der Art
char
können stellen Werte dar, die von -2147483648 bis 2147483647? Wenn ja, würde wassizeof(char)
im Rahmen dieser Umsetzung? Was würde sind die kleinsten und größten Bereiche der Typint
?
Antwort (ebenda, S. 382.):
Es ist erlaubt (wenn verschwenderisch) für eine Umsetzung 32 Bits zu verwenden, um vertreten Typ
char
. Ohne Berücksichtigung die Umsetzung der Wert vonsizeof(char)
ist immer 1.
Dies ist zwar nicht ausdrücklich einen Fall ansprechen, wo, sagen Bytes sind 8 Bits und char
sind 4 dieser Bytes (eigentlich unmöglich mit der c99 Definition siehe unten), die Tatsache, dass immer sizeof(char) = 1
ergibt sich aus der C99-Standard und Harbison und Steele.
Edit: In der Tat (dies ist als Antwort auf Ihre upd 2 Frage), soweit c99 besorgt sizeof(char)
ist ist in Bytes, aus dem Abschnitt 6.5.3.4 wieder:
Der Operator sizeof liefert die Größe (In Bytes) des Operanden
so mit dem Zitat oben kombiniert, Bytes von 8 Bits und char
als 4 dieser Bytes ist unmöglich. Für C99 ein Byte das gleiche wie ein char
ist
In Antwort auf Ihre Erwähnung der Möglichkeit eines 7-Bit-char
: Das ist in c99 nicht möglich. Gemäß Abschnitt 5.2.4.2.1 des Standards der Minimum ist 8:
Ihre Umsetzung definierter Werte sind gleich oder größer [Hervorhebung von mir] in der Größe zu dem gezeigten, mit dem gleichen Vorzeichen.
- Anzahl der Bits, die für kleinstes Objekt, das nicht ein bisschen Feld (Byte)
ist **CHAR_BIT 8**
- Minimalwert für ein Objekt vom Typ signed char
**SCHAR_MIN -127//−(27−1)**
- Maximalwert für ein Objekt vom Typ signed char
**SCHAR_MAX +127//27−1**
- Maximalwert für ein Objekt vom Typ unsigned char
**UCHAR_MAX 255//28−1**
- Minimalwert für ein Objekt vom Typ char
**CHAR_MIN** see below
- Maximalwert für ein Objekt vom Typ char
**CHAR_MAX** see below
[...]
Wenn der Wert eines Objekts vom Typ char wird als eine vorzeichenbehaftete ganze Zahl behandelt, wenn in einem Ausdruck verwendet, der Wert von CHAR_MIN soll das gleiche sein wie die der SCHAR_MIN und der Wert von CHAR_MAX wird das gleiche sein wie die der SCHAR_MAX. Andernfalls wird der Wert von CHAR_MIN ist 0 und der Wert von CHAR_MAX soll das gleiche sein wie die der UCHAR_MAX. Der Wert UCHAR_MAX gleich 2 ^ CHAR_BIT soll -. 1
Andere Tipps
Es sind keine Maschinen, bei denen sizeof(char)
ist 4. Es ist immer 1 Byte. Das Byte kann 32 Bits enthalten, aber so weit wie der C-Compiler betrifft, so ist es ein Byte. Weitere Einzelheiten werde ich Sie tatsächlich zeigen auf der C ++ FAQ 26,6 . Dieser Zusammenhang deckt es ziemlich gut, und ich bin ziemlich sicher, C ++ alle diese Regeln bekam von C. können Sie auch unter comp.lang.c FAQ 8.10 Zeichen größer als 8 Bit.
Upd2: Aber sizeof Ergebnis ist kein BYTES ! es ist die Größe von CHAR. Und char kann sein 2-Byte oder (möglicherweise) 7 Bit?
Ja, es ist Bytes. Lassen Sie uns sagen, dass es wieder. sizeof(char)
ist 1 Byte nach den C-Compiler. Was die Menschen umgangssprachlich nennen ein Byte (8 Bit) ist nicht unbedingt das gleiche wie das, was die C-Compiler ein Byte bezeichnet. Die Anzahl der Bits in einem C-Byte variiert je nach Maschinenarchitektur. Es ist auch zumindest seine 8 gewährleistet.
PDP-10 und PDP-11 war.
Update: es wie kein C99-Compiler für PDP-10
Einige Modelle von Analog Devices 32-Bit SHARC DSP haben CHAR_BIT = 32, und Texas Instruments DSP von TMS32F28xx haben CHAR_BIT = 16, wie verlautet.
Update: Es gibt GCC 3.2 für PDP-10 mit CHAR_BIT = 9 (Check include / limits.h in diesem Archiv).