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?

War es hilfreich?

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 was sizeof(char)   im Rahmen dieser Umsetzung? Was würde   sind die kleinsten und größten Bereiche der   Typ int?

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 von   sizeof(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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top