Gibt es Maschinen, bei denen sizeof(char) != 1 oder zumindest CHAR_BIT > 8 ist?

Lesezeit: 9 Minuten

Benutzeravatar von osgx
osgx

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 ?

  • 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 von wchar.) Auch wenn die Norm das sagt sizeof(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, ob sizeof(int) == sizeof(long) oder ob CHAR_BIT 32 oder 64 war; Ich schätze, es war 32, und ich denke sizeof(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

Benutzeravatar von Ramashalanka
Ramashalanka

Es ist immer eins in C99, Abschnitt 6.5.3.4:

Bei Anwendung auf einen Operanden mit Typ char, unsigned charoder 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.

  • Wenn Sie wissen, dass Sie mit char-Typen arbeiten und Sie wissen, dass die Sprache eine Größe von 1 erfordert, warum ist es dann eine gute Idee, immer die redundante Größe von (char) anzugeben?

    Roger Pate

    7. Februar 2010 um 3:58 Uhr

  • @ Roger. Im Allgemeinen ist es natürlich sehr wichtig, es zu verwenden sizeof für die Implementierungsunabhängigkeit. Ja, angesichts all der oben genannten char ist eine kleine Ausnahme, und es ist sicher anzunehmen sizeof(char)=1. Ich sagte “gute Idee”, weil: (a) wenn jemand später die Verwendung ändert, z. longes verringert die Wahrscheinlichkeit von Fehlern, da sizeof(char) dient als Erinnerung, (b) ein Codeleser wie das OP, der sich nicht sicher ist sizeof(char), verschwendet keine Zeit damit, sich Gedanken darüber zu machen, ob der Code korrekt ist, (c) aktuelle nicht standardmäßige oder zukünftige Implementierungen (unwahrscheinlich). Das ist jedenfalls der Grund für meine Angewohnheit.

    – Ramashalanka

    7. Februar 2010 um 4:40 Uhr

  • (a) und (c) haben viel schwerwiegendere Auswirkungen, die nicht gelöst oder auch nur annähernd gelöst werden können; auch YAGNI. Jemandem wie in (b) muss man es nur einmal sagen – ich muss es ihm nicht in jeder Zeile meines Codes beibringen. Es gibt jedoch Nachteile bei der Verwendung sizeof(char): Es ist ein weiterer Punkt, der diskutiert/überprüft werden muss/etc. in Ihren Codierungskonventionen/Standards/Richtlinien, verschwendet meine Zeit damit, sich zu fragen, ob Sie C wirklich kennen und was sonst noch falsch sein könnte, nimmt visuelle/mentale/Textzeilen-“Bandbreite” in Anspruch.

    Roger Pate

    7. Februar 2010 um 4:46 Uhr


  • @Ramashalanka: Ja, der kompilierte Code ist gleichwertig. Es sind all die Probleme rund um die Lesbarkeit und wie die Leute den Quellcode anderweitig verwenden, über die ich spreche. (Und FWIW, ich denke, Sie haben hier eine anständige +1-Antwort, ich finde “immer Größe von (Zeichen) verwenden” einfach fehlgeleitet und ein Hotbutton-Problem für mich, auch wenn es ein kleines Problem ist.)

    Roger Pate

    8. Februar 2010 um 8:18 Uhr


  • @Ramashalanka: Ich nehme an, es ist jedoch eine subjektive Sache. Es ist in Ordnung, wenn einige Leute es wirklich benutzen wollen, um es für den Rest der Zeit konsequent zu verwenden. Meiner Meinung nach macht es jedoch keinen Sinn, denn wenn Sie dem nicht vertrauen können sizeof(char) == 1 gleich bleiben, man kann auf nichts wirklich vertrauen.

    – mk12

    9. August 2012 um 0:08 Uhr

Benutzeravatar von Michael Kristofik
Michael Kristofik

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.

  • Bitte!!! C++ ist die wirklich UNTERSCHIEDLICHE Sprache von C (C99). Diese Frage bezieht sich nur auf einfaches C.

    – osgx

    7. Februar 2010 um 2:04 Uhr


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

    – osgx

    7. Februar 2010 um 2:09 Uhr


  • @osgx, ich neige dazu, genauso viel zu schreien wie du es gerade getan hast, wenn Leute versuchen, C und C++ zu mischen. Aber ich denke in diesem Fall dieser eine C++-FAQ-Eintrag gilt gleichermaßen für C.

    – Michael Kristofik

    7. Februar 2010 um 2:35 Uhr

  • Der korrekte Name für “8 Bits” ist Oktett. Der C-Standard verwendet das Wort “Byte” für ein Objekt, das die Größe eines Zeichens hat. Andere verwenden das Wort “Byte” möglicherweise auf unterschiedliche Weise, oft wenn sie “Oktett” bedeuten, aber in C (und C++ oder Objective-C) bedeutet es “Objekt von der Größe eines Zeichens”. Ein Zeichen kann mehr als 8 Bit oder mehr als ein Oktett umfassen, aber es ist immer ein Byte.

    – gnasher729

    11. April 2014 um 14:09 Uhr

Benutzeravatar von osgx
osgx

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).

  • Verwechseln Sie nicht Implementierungen von C-ähnlichen Sprachen, die C nicht entsprechen. Sie sagten sogar: “Ich mache mir Sorgen um die Einhaltung des C99-Standards. Ich arbeite eng mit C99-Compilern zusammen.”

    Roger Pate

    7. Februar 2010 um 4:01 Uhr

  • @Roger: Es ist nicht fair, GCC3 als nicht C99-konform zu bezeichnen, es sei denn, Sie haben es mit extremen Grenzfällen zu tun, die als Fehler in GCC angesehen werden.

    – Josua

    7. Februar 2010 um 4:39 Uhr


  • @Joshua, ich glaube, Roger sagt über historische Compiler von K&R und pcc. Es ist auch nicht fair zu behaupten, C99-konform zu sein, bevor die C99-Compliance-Testsuite auf PDP-10 ausgeführt wird, wenn sie mit diesem Port kompiliert wird (es kann Fehler beim Portieren und auf dem Computer selbst geben). Es ist jedoch zu erwarten, dass es dem C99-Standard nahe kommt, ebenso wie GCC3.2 auf x86.

    – osgx

    7. Februar 2010 um 4:42 Uhr


  • @Joshua: CHAR_BIT darf in C99 größer als 8 sein, aber sizeof(char) muss immer noch 1 sein (und diese Antwort war ganz anders, als ich diesen Kommentar hinterlassen habe). Ich nenne GCC3 nicht nicht konform, und C89 stellt hier die gleiche Anforderung, übrigens. Ich habe diesen Text zitiert, um zu sagen, dass osgx derjenige ist, der sich Sorgen um die C99-Konformität macht und C99-Compiler verwendet, also Warum macht er sich Sorgen um Nicht-C99-Compiler?

    Roger Pate

    7. Februar 2010 um 4:55 Uhr

  • Autor von PDP-10 GCC hier. CHAR_BIT ist 9, aber sizeof(char) ist immer noch 1.

    – Lars Brinkhoff

    3. November 2016 um 8:01 Uhr


1421460cookie-checkGibt es Maschinen, bei denen sizeof(char) != 1 oder zumindest CHAR_BIT > 8 ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy