Gibt es Maschinen (oder Compiler), wo sizeof(char) != 1
?
Sagt der C99-Standard , dass sizeof(char)
bei der Implementierung der Standardkonformität genau 1 sein muss? Wenn ja, geben Sie mir bitte die Abschnittsnummer und das Zitat.
Update:
Wenn ich einen Computer (CPU) habe, der keine Bytes adressieren kann (minimaler Lesevorgang ist 4 Bytes, ausgerichtet), aber nur 4 Bytes ( uint32_t
), kann der Compiler für diesen Computer sizeof(char)
4 definieren ? sizeof(char)
wird 1 sein, aber char wird 32 Bit ( CHAR_BIT
Makros) haben
Update2: Aber die Größe des Ergebnisses ist KEIN BYTES! es ist 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
?
char
(anstelle vonwchar
) verwenden. Selbst wenn der Standard besagt, dasssizeof(char)
dies 1 sein muss, würde ich mich nicht auf diese Annahme verlassen.sizeof(char)
ist immer 1, auch wenn char 32-Bit ist (wie es auf einigen Systemen der Fall ist). C hat viele lustige Warzen.sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int)
erinnere mich nicht, obsizeof(int) == sizeof(long)
oder ob CHAR_BIT 32 oder 64 war; ich erwarte, dass es 32 war, und ich denkesizeof(long) == 1
auch. (Sie können einen Verweis auf ein Cray C-Handbuch finden, aber keinen Online-Zugriff darauf .)Antworten:
Es ist immer eins in C99, Abschnitt 6.5.3.4:
Bearbeiten: nicht Teil Ihrer Frage, aber aus Interesse von Harbison und Steele, 3. Aufl. (vor c99) p. 148:
Bearbeiten: Als Antwort auf Ihre aktualisierte Frage ist die folgende Frage und Antwort von Harbison und Steele relevant (ebenda, Bsp. 4 von Kap. 6):
Antwort (ebenda, S. 382):
Dies betrifft zwar nicht speziell einen Fall, in dem beispielsweise Bytes 8 Bit und
char
4 dieser Bytes sind (mit der c99-Definition tatsächlich unmöglich, siehe unten), die Tatsache, dass diessizeof(char) = 1
immer aus dem c99-Standard und Harbison und Steele hervorgeht.Edit: In der Tat (dies ist als Antwort auf Ihre upd 2 Frage), soweit c99 angeht
sizeof(char)
ist in Bytes, aus dem Abschnitt 6.5.3.4 wieder:In Kombination mit dem obigen Zitat sind Bytes mit 8 Bits und
char
4 dieser Bytes unmöglich: Für c99 ist ein Byte dasselbe wie achar
.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 beträgt das Minimum 8:Ihre implementierungsdefinierten Werte müssen gleich oder größer sein [meine Betonung] als die gezeigten mit dem gleichen Vorzeichen.
- Anzahl der Bits für das kleinste Objekt, das kein Bitfeld ist (Byte)
- Mindestwert für ein Objekt vom Typ signiertes Zeichen
- Maximalwert für ein Objekt vom Typ signiertes Zeichen
- Maximalwert für ein Objekt vom Typ vorzeichenloses Zeichen
- Mindestwert für ein Objekt vom Typ char
- Maximalwert für ein Objekt vom Typ char
[...]
quelle
sizeof(char)
: Es ist ein weiterer Punkt, über den diskutiert / geprüft / etc. Verschwenden Sie in Ihren Codierungskonventionen / -standards / -richtlinien meine Zeit damit, sich zu fragen, ob Sie C wirklich kennen und was sonst möglicherweise falsch ist, und nehmen Sie visuelle / mentale / Textzeilen- "Bandbreite" ein.Es gibt keine Maschinen, auf denen
sizeof(char)
4 ist. 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 auf die C ++ - FAQ 26.6 verweisen . Dieser Link deckt es ziemlich gut ab und ich bin ziemlich sicher, dass C ++ all diese Regeln von C erhalten hat. Sie können auch in der FAQ 8.10 von comp.lang.c nach Zeichen suchen, die größer als 8 Bit sind.Ja, es sind Bytes. Lass es mich noch einmal sagen.
sizeof(char)
ist laut C-Compiler 1 Byte. Was umgangssprachlich ein Byte (8 Bit) genannt wird, ist nicht unbedingt dasselbe wie das, was der C-Compiler ein Byte nennt. Die Anzahl der Bits in einem C-Byte hängt von Ihrer Maschinenarchitektur ab. Es ist auch garantiert mindestens 8.quelle
PDP-10
und PDP-11waren.Update: Es
gibt 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, wie verlautet .
Update: Es gibt GCC 3.2 für PDP-10 mit CHAR_BIT = 9 (überprüfen Sie include / limits.h in diesem Archiv).
quelle