Wird ein ‘char’ immer-immer-immer 8 Bits haben?

Lesezeit: 8 Minuten

Benutzeravatar von lindelof
Lindelof

Ich bin immer davon ausgegangen:

  1. dass ein char wird durch ein Byte dargestellt,
  2. dass man davon ausgehen kann, dass ein Byte immer 8 Bit hat,
  3. das sizeof (char) ist immer 1,
  4. und dass die maximale theoretische Menge an Speicher, die ich zuweisen kann (gezählt in chars) ist die Anzahl der RAM-Bytes (+ Auslagerungsspeicher).

Aber jetzt wo ich das gelesen habe Wikipedia-Eintrag auf dem Byte Ich bin mir nicht mehr so ​​sicher.

Welche meiner Annahmen ist falsch? Welche(r) ist gefährlich?

  • stackoverflow.com/questions/4266771/char-size-confusion stackoverflow.com/questions/881894/…

    – Josh Lee

    15. März 2012 um 20:16 Uhr


  • @MrLister: Was haben andere Sprachen damit zu tun?

    – Ed S.

    15. März 2012 um 20:50 Uhr

  • Die haben char Typen, und die Frage nach immer-immer-immer war so verzweifelt, dass ich das Bedürfnis verspürte, Situationen zu erwähnen, in denen sizeof char nicht 1 ist (selbst wenn es außerhalb von C liegt. Beachten Sie, dass weder der Fragentitel noch der Fragentext C erwähnen).

    – Herr Lister

    15. März 2012 um 21:44 Uhr


  • @MrLister: Deshalb haben wir Tags.

    Benutzer195488

    16. März 2012 um 12:48 Uhr

  • Ist CHAR_BIT jemals > 8?, System wo 1 Byte != 8 Bit?, Welche Plattformen haben etwas anderes als 8-Bit-Zeichen?

    – phuklv

    29. Januar 2020 um 5:22 Uhr

Benutzeravatar von Carl Norum
Karl Norum

  1. Ja, char und byte sind ziemlich gleich. Ein Byte ist die kleinste adressierbare Speichermenge, ebenso a char in C. char hat immer Größe 1.

    Aus der Spezifikation, Abschnitt 3,6 Byte:

    Byte

    adressierbare Datenspeichereinheit, die groß genug ist, um jedes Element des grundlegenden Zeichensatzes der Ausführungsumgebung aufzunehmen

    Und Abschnitt 3.7.1 Zeichen:

    Charakter

    Single-Byte-Zeichen
    Bitdarstellung, die in ein Byte passt

  2. EIN char hat CHAR_BIT Bits. Es könnte eine beliebige Zahl sein (je nach Spezifikation 8 oder mehr), aber meistens ist es definitiv 8. Es gibt echte Maschinen mit 16- und 32-Bit char Typen, obwohl. CHAR_BIT ist darin definiert limits.h.

    Aus der Spezifikation, Abschnitt 5.2.4.2.1 Größen von Integer-Typen <limits.h>:

    Die unten angegebenen Werte sind durch konstante Ausdrücke zu ersetzen, die für die Verwendung in geeignet sind #if Vorverarbeitungsanweisungen. Darüber hinaus, außer für CHAR_BIT und MB_LEN_MAX, wird das Folgende durch Ausdrücke ersetzt, die denselben Typ haben wie ein Ausdruck, der ein Objekt des entsprechenden Typs ist, der gemäß den Integer-Promotions konvertiert wurde. Ihre implementierungsdefinierten Werte müssen in der Größenordnung (absoluter Wert) gleich oder größer als die gezeigten sein, mit demselben Vorzeichen.

    — Anzahl der Bits für das kleinste Objekt, das kein Bitfeld (Byte) ist
    CHAR_BIT 8

  3. sizeof(char) == 1. Stets.

    Aus der Spezifikation, Abschnitt 6.5.3.4 Die sizeof OperatorAbsatz 3:

    Bei Anwendung auf einen Operanden mit Typ char, unsigned charoder signed char(oder eine qualifizierte Version davon) ist das Ergebnis 1.

  4. Sie können so viel Speicher zuweisen, wie Ihr System zulässt – es gibt nichts im Standard, das definiert, wie viel das sein könnte. Sie können sich beispielsweise einen Computer mit einem Cloud-Speicher-gestützten Speicherzuweisungssystem vorstellen – Ihr zuweisbarer Speicher könnte praktisch unendlich sein.

    Hier ist der komplette Spezifikationsabschnitt 7.20.3.3 Die malloc Funktion:

    Zusammenfassung

    1 #include <stdlib.h>

    void *malloc(size_t size);

    Beschreibung

    2 Die malloc Funktion weist Platz für ein Objekt zu, dessen Größe durch angegeben wird size und dessen Wert unbestimmt ist.

    Kehrt zurück

    3 Die malloc Die Funktion gibt entweder einen Nullzeiger oder einen Zeiger auf den zugewiesenen Speicherplatz zurück.

    Das ist die Gesamtheit der Spezifikation, also gibt es nicht wirklich eine Grenze, auf die Sie sich verlassen können.

  • Konkret ist es mit Memory Overcommit unter Linux durchaus möglich, 2 TB Speicher auf einer Box mit 8G Mem+Swap zuzuweisen.

    – David

    16. März 2012 um 21:55 Uhr


  • „Ein Char hat CHAR_BIT Bits” — wo bekommst du das her? Das sagt die C-Norm CHAR_BIT ist “Anzahl Bits für kleinstes Objekt, das kein Bitfeld (Byte) ist” — Hinweis: Byte, nicht char. Verwandte Frage: Ist die Anzahl der Bits in einem Byte gleich der Anzahl der Bits in einem Typ char?

    – jfs

    29. März 2016 um 15:53 ​​Uhr

  • @JFSebastian, genau das steht in Teil 1 meiner Antwort.

    – Karl Norum

    29. März 2016 um 16:09 Uhr

  • @CarlNorum: Ich verstehe nicht CHAR_BIT in Teil 1 Ihrer Antwort überhaupt erwähnt wird. Behauptest du das von sizeof(char) == 1 (true) folgt daraus, dass die Anzahl der Bits in einem Typ char ist CHAR_BIT dh es gibt keine Füllbits? Unabhängig von der Antwort öffnen Sie bitte meine Frage erneut, da Ihre Antwort zumindest meine Frage nicht beantwortet Für mich — die Fragen sind verwandt, aber ich sehe keinen Zusammenhang in der Antwort

    – jfs

    29. März 2016 um 16:18 Uhr


  • @JFSebastian – Teil 1: “Byte == Zeichen”. Teil 2 “char hat CHAR_BIT-Bits”.

    – Karl Norum

    29. März 2016 um 16:44 Uhr

Benutzeravatar von Michael Foukarakis
Michael Foukarakis

sizeof(char) ist immer 1 Byte. Ein Byte ist jedoch nicht immer ein Oktett: Das Texas Instruments TI C55xist beispielsweise ein DSP mit einem 16-Bit-Byte.

  • Es gibt viele echte Maschinen mit Nicht-8-Bit-Bytes.

    – Karl Norum

    15. März 2012 um 20:34 Uhr

  • Antwort auf seine Frage ist einfach, NEIN. Genau aus diesem Grund existieren CHAR_BIT-Konstanten in Posix-Bibliotheken.

    – Tomás Pruzina

    16. März 2012 um 4:40 Uhr

  • @TomasPruzina Die Erwähnung von POSIX (und nicht ISO C) ist hier wahrscheinlich etwas irreführend, da Standards bereits POSIX-2001 / SUSv3 CHAR_BIT = 8 erforderten (obwohl POSIX.1-1988, SUSv1 und SUSv2 nur die ISO C-Anforderung wiederholten, die CHAR_BIT ≥ 8). AFAIU Die meisten Systeme mit Nicht-8-Bit-Zeichen sind eindeutig Nicht-POSIX.

    – Alex Shpilkin

    29. Mai 2021 um 0:24 Uhr

sizeof(char) ist definiert, immer zu sein 1. Ab C99:

Bei Anwendung auf einen Operanden vom Typ char, unsigned char oder signed char (oder eine qualifizierte Version davon) ist das Ergebnis 1.

es ist nicht jedoch garantiert 8 Bit. In der Praxis wird es auf der überwiegenden Mehrheit der Plattformen da draußen so sein, aber nein, Sie können sich technisch nicht darauf verlassen, dass dies immer der Fall ist (es sollte auch keine Rolle spielen, wie Sie es verwenden sollten). sizeof ohnehin).

  • Können Sie erklären, was das bedeutet? A) Du sagst “sizeof(char) ist immer 1” definiert. Eine was? B) Du sagst “Es ist jedoch nicht garantiert, dass es 8 Bit sind” Was ist “es”? Ein Byte? ein Char? C) Und Sie sagen, dass Sie sizeof(char) verwenden sollten, als wollten Sie andeuten, dass es vielleicht nicht 1 sein wird, also ist es sicherer, immer sizeof zu verwenden, aber Sie sagen, dass “sizeof(char) so definiert ist, dass es immer 1 ist”. Meinen Sie also, falls die Plattform nicht C99-konform ist?

    – Barlop

    19. Oktober 2015 um 20:54 Uhr

  • Ich nehme an, Sie meinen A) 1 Byte B) ein Byte, und daher ist ein Zeichen, da ein Zeichen ein Byte ist, nicht garantiert 8 Bit lang. Aber was ist mit “C”? Wenn Sie sizeof(char) verwenden, wie ist das nützlich, wenn Sie wissen, dass es immer 1 sein wird? und diese 1 wird Ihnen sowieso nicht sagen, wie viele Bits es sind.

    – Barlop

    19. Oktober 2015 um 21:14 Uhr


  • Auf jeder gegebenen Plattform sind ein “Byte”, ein “Zeichen” und die Einheit zum Verweisen auf eine Adresse oder Größe im Speicher gleich. sizeof byte ist immer 1, auch auf Systemen, wo ein Byte nicht 8 Bit groß ist, da das Ergebnis von sizeof gemessen wird in Byte. Dies ist nützlich, da der Speicher auf jeder Plattform so gemessen und adressiert wird. Die Anzahl der Bits in einem Byte wird von der Plattform definiert, ist also zur Kompilierzeit bekannt und Sie können ein #define verwenden

    – Thomas Rutter

    12. Dezember 2020 um 8:48 Uhr


Konkret haben einige Architekturen, insbesondere im DSP-Bereich, Zeichen größer als 8 Bit. In der Praxis opfern sie Speicherplatz für Geschwindigkeit.

Herkömmlicherweise besteht ein Byte nicht unbedingt aus 8 Bits, sondern lediglich aus einem kleineren Speicherbereich, der normalerweise zum Speichern eines Zeichens geeignet ist. Der C-Standard folgt dieser Verwendung, sodass die von malloc und sizeof verwendeten Bytes mehr als 8 Bit umfassen können. [footnote] (Der Standard erlaubt nicht, dass sie kleiner sind.)

Aber sizeof(char) ist immer 1.

Auswendiglernen der C-Häufig gestellte Fragen ist ein karrierefördernder Schritt.

In C ist ein Zeichen immer ein Byte, also sind Ihre erste und dritte Annahme richtig.

Ein Byte ist nicht immer 8 Bit, also gilt Ihre zweite Annahme nicht immer. Allerdings haben >= 99,99 % aller heute existierenden Systeme 8-Bit-Zeichen, so dass viel Code implizit 8-Bit-Zeichen annimmt und auf allen Zielplattformen problemlos läuft. Sicherlich verwenden Windows- und Mac-Maschinen immer 8-Bit-Zeichen, und AFAIK Linux tut dies auch (Linux wurde auf so viele Plattformen portiert, dass ich nicht 100% sicher bin, dass jemand Linux nicht auf eine Plattform portiert hat, auf der 9-Bit-Zeichen Sinn ergeben).

Die maximale Speichermenge, die zugewiesen werden kann, ist die Größe des virtuellen Speichers abzüglich des für das Betriebssystem reservierten Speicherplatzes.

Benutzeravatar von Adam Bak
Adam Bak

Das Unglückliche (oder vielleicht Glückliche, je nachdem, wie Sie die Dinge sehen) ist, dass die Vorstellung davon, was ein Byte allgemein als (8 Bits) angesehen wird, nicht gleichbedeutend mit dem ist, was die Programmiersprache C unter einem Byte versteht. Wenn man sich einige der vorherigen Antworten ansieht, hat ein Byte eine genaue Definition, wenn es um die Programmiersprache C geht, und nirgendwo in der Definition wird ein Byte mit 8 Bit erwähnt. Es erwähnt einfach, dass ein Byte ist

“eine adressierbare Datenspeichereinheit, die groß genug ist, um jedes Mitglied des grundlegenden Zeichensatzes der Ausführungsumgebung aufzunehmen.”

Um also Ihre Frage zu beantworten: „Will a char immer-immer-immer 8 Bit“, lautet die Antwort, nicht immer, aber meistens. Wenn Sie genau wissen möchten, wie viel Speicherplatz Ihre Datentypen auf Ihrem System verbrauchen, können Sie die folgende Codezeile verwenden:

sizeof(type) * CHAR_BIT

Wo, type ist Ihr Datentyp. Um beispielsweise herauszufinden, wie viele Bits a char auf Ihrem System aufnimmt, können Sie Folgendes verwenden:

printf("The number of bits a 'char' has on my system: %zu\n", sizeof(char) * CHAR_BIT);

Dies ist dem GNU C Library Reference Manual entnommen, das die folgende aufschlussreiche Erklärung zu diesem Thema enthält:

Es gibt keinen Operator in der Sprache C, der Ihnen die Anzahl der Bits in einem Integer-Datentyp geben kann. Aber Sie können es aus dem Makro CHAR_BIT berechnen, das in der Header-Datei limits.h definiert ist. CHAR_BIT — Dies ist die Anzahl der Bits in einem Zeichen – auf den meisten Systemen acht. Der Wert ist vom Typ int. Sie können die Anzahl der Bits in jedem Datentyp wie folgt berechnen:

    `sizeof (type) * CHAR_BIT` 

Dieser Ausdruck enthält Füllbits sowie Wert- und Vorzeichenbits.

1412580cookie-checkWird ein ‘char’ immer-immer-immer 8 Bits haben?

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

Privacy policy