Ich bin immer davon ausgegangen:
- dass ein
char
wird durch ein Byte dargestellt,
- dass man davon ausgehen kann, dass ein Byte immer 8 Bit hat,
- das
sizeof (char)
ist immer 1
,
- und dass die maximale theoretische Menge an Speicher, die ich zuweisen kann (gezählt in
char
s) 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?
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.
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).
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.
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.
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 denensizeof 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