2010-02-07 1 views
86

Gibt es Maschinen (oder Compiler), wo sizeof(char) != 1?Gibt es Maschinen mit der Größe (char)! = 1 oder mindestens CHAR_BIT> 8?

Ist C99 Standard besagt, dass sizeof(char) auf Standard-Compliance-Implementierung muss genau 1? Wenn dies der Fall ist, geben Sie bitte die Abschnittsnummer und das Zitat an.

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) können für diesen Compiler Maschine definieren sizeof(char) zu 4? sizeof(char) wird 1 sein, aber char 32 Bit (CHAR_BIT Makros)

Update2 haben: Aber sizeof Ergebnis ist kein BYTES! Es ist die Größe von CHAR. Und Char kann 2 Byte sein, oder (vielleicht) 7 Bit?

Update3: Ok. Alle Maschinen haben sizeof(char) == 1. Aber welche Maschinen haben CHAR_BIT > 8?

+0

Worüber machen Sie sich Sorgen? Sie mögen es nicht, sizeof() aufzurufen? –

+4

Ich bin besorgt in C99 Standard-Compliance. Ich arbeite eng mit C99-Compilern – osgx

+2

Da Unicode noch wichtiger wird, könnten nicht-standard Compiler kommen, die Unicode-Zeichen als 'char' verwenden (anstelle von' wchar'.) Auch wenn der Standard besagt, dass 'sizeof (char)' muss sei 1, würde ich mich nicht auf diese Annahme verlassen. –

Antwort

86

Es ist immer ein in C99, Abschnitt 6.5.3.4:

Wenn auf einen Operanden angewandt, die Typen char, unsigned char hat oder char signiert, (oder eine qualifizierte Version davon) die Ergebnis ist 1.

Edit: nicht Teil Ihrer Frage, aber für Interesse von Harbison und Steele, 3. Ausgabe. (vor c99) p. 148:

Eine Speichereinheit wird als die Menge an Speicher von einem Zeichen besetzt werden; char die Größe eines Objekts von Typ ist daher 1.

Edit: In Antwort auf Ihre Frage aktualisiert, die folgende Frage und Antwort von Harbison und Steele ist relevant (. Ebd., Ex 4 von Ch 6) :

Ist es zulässig, bei der eine C Implementierung zu haben Typ char von -2.147.483.648 durch 2147483647 Werte im Bereich darstellen kann? Wenn ja, was wäre sizeof(char) unter dieser Implementierung? Was wäre die kleinsten und größten Bereiche von type int?

Antwort (ibid, S. 382).:

Es erlaubt ist (wenn verschwenderisch) für eine Implementierung 32 Bits verwenden repräsentieren Typ char. Unabhängig von der Implementierung ist der Wert sizeof(char) immer 1.

Während dies ausdrücklich keinen 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 sizeof(char) = 1 immer klar ist, aus der c99 Standard und Harbison und Steele.

Edit: In der Tat (dies ist als Antwort auf Ihre upd 2 Frage), soweit c99 sizeof(char)betrifft, ist in Bytes, aus dem Abschnitt 6.5.3.4 wieder:

Der Operator sizeof Ausbeuten 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.

Als Antwort auf Ihre Erwähnung der Möglichkeit eines 7-Bit char: Dies ist nicht in c99 möglich. 5.2.4.2.1 des Standards der Minimum Abschnitt nach ist 8:

Ihre Umsetzung definierter Werte sind oder mehr [Hervorhebung von mir] in der Größe zu den gezeigten, mit dem gleichen Vorzeichen gleich sein.

- Anzahl der Bits, die für kleinstes Objekt, das nicht ein Bit-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 signiert char

- 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 als signed integ behandelt wird Wenn in einem Ausdruck verwendet wird, muss der Wert CHAR_MIN der gleiche sein wie SCHAR_MIN und der Wert von CHAR_MAX muss mit dem Wert SCHAR_MAX übereinstimmen. Andernfalls muss der Wert CHAR_MIN 0 sein und der Wert CHAR_MAX muss mit UCHAR_MAX übereinstimmen. Der Wert UCHAR_MAX wird 2^CHAR_BIT gleich - 1.

+9

Zusätzliche Anmerkung Es gibt ein CHAR_BITS Makro, das Ihnen sagen wird, wie viele Bits Ihre Zeichen sind – nos

+1

Die vollständigen Daten dieses großen Buches ist * Harbison C: A Reference Manual, Dritte Ausgabe, Prentice Hall, 1991 * – osgx

+0

Ja, danke, dass du den Titel eingibst, das ist der Harbison und Steele, den ich oben zitiere (beachte, dass es nicht behandelt wird) c99). – Ramashalanka

16

Es sind keine Maschinen, bei denen sizeof(char) ist 4. Es ist immer 1 Byte.Dieses Byte könnte 32 Bits enthalten, aber soweit es den C-Compiler betrifft, ist es ein Byte. Für weitere Details werde ich Sie auf die C++ FAQ 26.6 verweisen. Dieser Link deckt das ziemlich gut ab und ich bin ziemlich sicher, dass C++ alle diese Regeln von C hat. Sie können auch comp.lang.c FAQ 8.10 für Zeichen betrachten, die größer als 8 Bits sind.

Upd2: Aber sizeof Ergebnis ist kein BYTES ! Es ist die Größe von CHAR. Und char kann 2 Byte sein, oder (vielleicht) 7 Bit?

Ja, es ist Bytes. Lass es mich nochmal sagen. sizeof(char) ist 1 Byte nach dem C-Compiler. Was Leute umgangssprachlich ein Byte (8 Bit) nennen, ist nicht unbedingt dasselbe wie der C-Compiler ein Byte aufruft. Die Anzahl der Bits in einem C-Byte hängt von Ihrer Maschinenarchitektur ab. Es ist auch garantiert mindestens 8.

+2

Bitte !!! C++ ist die wirklich UNTERSCHIEDLICHE Sprache von C (C99). Diese Frage betrifft nur reines C. – osgx

+0

Was kann ich tun, wenn Maschine/CPU nicht auf 8-Bit-Bytes zugreifen kann? Nicht ausgerichteter Zugriff ist verboten. (Sogar auf x86 malloc gibt ausgerichtete Daten zurück und teilt Speicher in Multiplikationen von 4 Bytes zu.) Dann wird CHAT_BIT größer als 8 sein. Ja, solche Plattformen können ziemlich speziell sein. osgx

+9

@osgx, ich neige dazu, so viel zu schreien wie du gerade getan hast, wenn Leute versuchen, C und C++ zu mischen. Aber ich denke ** in diesem Fall **, dass ein C++ - FAQ-Eintrag auch für C. gilt. –

8

PDP-10 und PDP-11 war.

Update: gibt es keine 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, reportedly.

Update: Es gibt GCC 3.2 for PDP-10 mit CHAR_BIT = 9 (überprüfen Sie include/limits.h in diesem Archiv).

+1

Verwechseln Sie Implementierungen von C-ähnlichen Sprachen nicht mit C. Sie haben sogar gesagt: "Ich bin besorgt über die C99-Standardkonformität. Ich arbeite eng mit C99-Compilern zusammen." –

+1

@Roger: Es ist nicht fair, GCC3 nicht C99-kompatibel zu nennen, es sei denn, es handelt sich um extreme Randfälle, die in GCC als Fehler angesehen werden. – Joshua

+1

@Joshua, ich denke Roger sagt über K & R und pcc historische Compiler. Es ist auch nicht fair zu behaupten, dass es C99-konform ist, bevor C99 compliance testsuite auf PDP-10 ausgeführt wird, wenn es mit diesem Port kompiliert wird (es kann Fehler bei der Portierung und von der Maschine selbst geben). Es kann jedoch erwartet werden, dass es nahe am C99-Standard liegt, wie es bei GCC3.2 auf x86 der Fall ist. – osgx

Verwandte Themen