Gibt es Maschinen (oder Compiler), wo sizeof(char) != 1
?
Tut C99-Standard sagt, dass sizeof(char)
auf Standard-Compliance-Implementierung MUSS genau 1 sein? Wenn ja, geben Sie mir bitte Abschnittsnummer und Zitat an.
Aktualisieren:
Wenn ich eine Maschine (CPU) habe, die keine Bytes adressieren kann (minimales Lesen ist 4 Bytes, ausgerichtet), sondern nur 4-s Bytes (uint32_t
), kann Compiler für diese Maschine definieren sizeof(char)
bis 4? sizeof(char)
wird 1 sein, aber char wird 32 Bit haben (CHAR_BIT
Makros)
Update2:
Aber sizeof result ist KEIN BYTES ! es hat die Größe von CHAR. Und char kann 2 Byte oder (möglicherweise) 7 Bit sein?
Update3:
OK. Alle Maschinen haben sizeof(char) == 1
. Aber welche Maschinen haben CHAR_BIT > 8
?
Es ist immer eins in C99, Abschnitt 6.5.3.4:
Bei Anwendung auf einen Operanden mit Typ char
, unsigned char
oder signed char
(oder eine qualifizierte Version davon) ist das Ergebnis 1
.
Bearbeiten: nicht Teil Ihrer Frage, aber für das Interesse von Harbison und Steele. C: Ein Referenzhandbuch, dritte Ausgabe, Prentice Hall, 1991 (vor c99) p. 148:
Eine Speichereinheit wird als die Speichermenge angesehen, die von einem Zeichen belegt wird; die Größe eines Objekts des Typs char
ist deshalb 1
.
Bearbeiten: Als Antwort auf Ihre aktualisierte Frage ist die folgende Frage und Antwort von Harbison und Steele relevant (ebenda, Ex. 4 von Ch. 6):
Ist es zulässig, eine C-Implementierung in welchem Typ zu haben? char
kann Werte im Bereich von -2.147.483.648 bis 2.147.483.647 darstellen? Wenn ja, was wäre sizeof(char)
unter dieser Implementierung? Was wären die kleinsten und größten Typenbereiche? int
?
Antwort (ebd., S. 382):
Es ist erlaubt (wenn es verschwenderisch ist), dass eine Implementierung 32 Bits verwendet, um den Typ darzustellen char
. Unabhängig von der Implementierung ist der Wert von
sizeof(char)
ist immer 1.
Während dies nicht speziell einen Fall anspricht, in dem beispielsweise Bytes 8 Bits sind und char
sind 4 dieser Bytes (eigentlich unmöglich mit der c99-Definition, siehe unten), die Tatsache, dass sizeof(char) = 1
ist immer klar aus dem c99-Standard und Harbison und Steele.
Bearbeiten: In der Tat (dies ist eine Antwort auf Ihre Frage zu Upd 2), soweit es c99 betrifft sizeof(char)
ist in Bytes, wieder aus Abschnitt 6.5.3.4:
Das sizeof
Operator liefert die Größe (in Bytes) seines Operanden
so kombiniert mit dem Zitat oben, Bytes von 8 Bit und char
Da 4 dieser Bytes unmöglich sind: Für c99 ist ein Byte dasselbe wie ein char
.
Als Antwort auf Ihre Erwähnung der Möglichkeit eines 7-Bit char
: Dies ist in c99 nicht möglich. Gemäß Abschnitt 5.2.4.2.1 der Norm ist die Minimum ist 8:
Ihre implementierungsdefinierten Werte müssen gleich sein oder größer [my emphasis] in der Größe zu den gezeigten, mit demselben Vorzeichen.
— Anzahl der Bits für das kleinste Objekt, das kein Bitfeld (Byte) ist
CHAR_BIT 8
— Mindestwert für ein Objekt des Typs signed char
SCHAR_MIN -127
— Maximalwert für ein Objekt des Typs signed char
SCHAR_MAX +127
— Maximalwert für ein Objekt des Typs unsigned char
UCHAR_MAX 255
— Mindestwert für ein Objekt des Typs char
CHAR_MIN
siehe unten
— Maximalwert für ein Objekt des Typs char
CHAR_MAX
siehe unten
[…]
Wenn der Wert eines Objekts vom Typ char
wird als vorzeichenbehaftete Ganzzahl behandelt, wenn sie in einem Ausdruck verwendet wird, der Wert von
CHAR_MIN
soll die gleiche sein wie die von
SCHAR_MIN
und der Wert von CHAR_MAX
soll die gleiche sein wie die von
SCHAR_MAX
. Andernfalls ist der Wert von
CHAR_MIN
muss 0
und der Wert von
CHAR_MAX
soll die gleiche sein wie die von
UCHAR_MAX
. Der Wert UCHAR_MAX
soll gleich sein 2CHAR_BIT − 1.
Es gibt keine Maschinen wo sizeof(char)
ist 4. Es ist immer 1 Byte. Dieses Byte kann 32 Bit enthalten, aber für den C-Compiler ist es ein Byte. Für weitere Details werde ich Sie tatsächlich auf die hinweisen C++-FAQ 26.6. Dieser Link deckt es ziemlich gut ab und ich bin mir ziemlich sicher, dass C++ all diese Regeln von C hat. Sie können sich das auch ansehen comp.lang.c FAQ 8.10 für Zeichen größer als 8 Bit.
Upd2: Aber sizeof result ist KEIN BYTES ! es hat die Größe von CHAR. Und char kann 2 Byte oder (möglicherweise) 7 Bit sein?
Ja, es sind Bytes. Lassen Sie es mich noch einmal sagen. sizeof(char)
ist laut C-Compiler 1 Byte. Was die Leute umgangssprachlich ein Byte (8 Bit) nennen, ist nicht unbedingt dasselbe wie das, was der C-Compiler ein Byte nennt. Die Anzahl der Bits in einem C-Byte variiert je nach Maschinenarchitektur. Es ist auch garantiert mindestens 8.
PDP-10 und PDP-11 war.
Aktualisieren: es gibt so gut wie 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, angeblich.
Update: Gibt es GCC 3.2 für PDP-10 mit CHAR_BIT=9 (überprüfen Sie include/limits.h in diesem Archiv).
Ich mache mir Sorgen um die Einhaltung des C99-Standards. Ich arbeite eng mit C99-Compilern zusammen
– osgx
7. Februar 2010 um 1:06 Uhr
Da Unicode noch wichtiger wird, könnten nicht standardmäßige Compiler kommen, die Unicode-Zeichen als verwenden
char
(Anstatt vonwchar
.) Auch wenn die Norm das sagtsizeof(char)
muss 1 sein, ich würde mich nicht auf diese Annahme verlassen.– Chip-Uni
7. Februar 2010 um 1:17 Uhr
Es gibt keine C-Compiler, bei denen sizeof(char) nicht 1 ist, Unicode oder nicht.
– Nr
7. Februar 2010 um 1:47 Uhr
@Chip:
sizeof(char)
ist immer 1, auch wenn char 32-Bit ist (was auf einigen Systemen vorkommt). C hat viele lustige Warzen.– Nick Bastin
1. Juli 2010 um 22:15 Uhr
Alle Versionen des C-Standards erfordern, dass CHAR_BIT mindestens 8 ist; Sie können nicht CHAR_BIT == 7 haben und standardkonform sein. Es ist jedoch durchaus machbar, dass Maschinen CHAR_BIT > 8 haben. Alte Cray-Maschinen hatten das, glaube ich (
sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int)
auf diesen; Ich erinnere mich nicht, obsizeof(int) == sizeof(long)
oder ob CHAR_BIT 32 oder 64 war; Ich schätze, es war 32, und ich denkesizeof(long) == 1
zu. (Sie finden einen Verweis auf, aber keinen Online-Zugriff auf a Cray C Handbuch).– Jonathan Leffler
2. Dezember 2013 um 0:41 Uhr