Warum ist ein char
1
byte lang in C? Warum ist es nicht 2
bytes oder 4
bytes lang?
Was ist die grundlegende Logik dahinter, um es als 1
byte zu behalten? Ich weiß in Java ein char
ist 2
Bytes lang. Gleiche Frage dazu.
char
ist 1 Byte in C
, weil es in Standards angegeben ist.
Die wahrscheinlichste Logik ist. Die (binäre) Darstellung eines char
(im Standardzeichensatz) kann in 1
byte passen. Zum Zeitpunkt der primären Entwicklung von C
waren die am häufigsten verfügbaren Standards ASCII
und EBCDIC
, die 7 bzw. 8-Bit-Codierung benötigten. Also, 1
byte war ausreichend, um den ganzen Zeichensatz darzustellen.
OTOH, während der Zeit, in der Java
ins Bild kam, waren die Konzepte der erweiterten Zeichensatzmengen und unicode
vorhanden. Um zukunftssicher zu sein und die Erweiterbarkeit zu unterstützen, wurde char
2 bytes
gegeben, das in der Lage ist, erweiterte Zeichensatzwerte zu verarbeiten.
Es liegt daran, dass die C-Sprache 37 Jahre alt ist und es keine Notwendigkeit gab, mehr Bytes für 1 Zeichen zu haben, da nur 128 ASCII-Zeichen verwendet wurden ( Ссылка ).
Warum sollte ein char
mehr als 1 Byte enthalten? Ein Zeichen repräsentiert normalerweise ein ASCII-Zeichen. Sehen Sie sich nur eine ASCII-Tabelle an, im (erweiterten) ASCII-Code stehen nur 256 Zeichen zur Verfügung. Sie müssen also nur Zahlen von 0 bis 255 darstellen, was zu 8 Bit = 1 Byte führt.
Sehen Sie sich eine ASCII-Tabelle an, z. hier: Ссылка
Das ist für C. Als Java entworfen wurde, erwarteten sie, dass es in Zukunft ausreichen würde, jedes Zeichen (auch Unicode) in 16 Bits = 2 Bytes zu speichern.
Als C entwickelt wurde (das erste Buch darüber wurde 1972 von seinen Entwicklern veröffentlicht), waren die beiden primären Zeichencodierungsstandards ASCII und EBCDIC, die jeweils 7- und 8-Bit-Codierungen für Zeichen darstellten. Und Speicher und Speicherplatz waren zu dieser Zeit beide größere Sorgen; C wurde auf Maschinen mit einem 16-Bit-Adressraum popularisiert, und die Verwendung von mehr als einem Byte für Strings wäre als verschwenderisch betrachtet worden.
Zu der Zeit, als Java (Mitte der 1990er Jahre) auftauchte, waren einige mit Weitblick in der Lage zu erkennen, dass eine Sprache einen internationalen Standard für die Zeichencodierung verwenden konnte, und so wurde Unicode für seine Definition gewählt. Speicher und Speicherplatz waren bis dahin weniger problematisch.
Sie benötigen nicht mehr als ein Byte, um die gesamte ASCII-Tabelle (128 Zeichen) darzustellen.
Aber es gibt andere C-Typen, die mehr Platz für Daten haben, wie int Typ (4 Bytes) oder long double Typ (12 Bytes).
Alle enthalten numerische Werte (selbst Zeichen! Auch wenn sie als "Buchstaben" dargestellt sind, sie sind "Zahlen", Sie können es vergleichen, hinzufügen ...).
Dies sind nur verschiedene Standardgrößen wie cm und m für die Länge.
Der C-Sprachstandard definiert eine virtuelle Maschine, bei der alle Objekte eine ganzzahlige Anzahl von abstrakten Speichereinheiten enthalten, die aus einer festen Anzahl von Bits bestehen (angegeben durch CHAR_BIT
macro in limits.h) . Jede Speichereinheit muss eindeutig adressierbar sein. Eine Speichereinheit ist definiert als die Speichermenge, die von einem einzelnen Zeichen aus dem Grundzeichensatz 1 belegt wird. Daher ist definition die Größe des Typs char
1.
Schließlich müssen diese abstrakten Speichereinheiten auf physische Hardware abgebildet werden. Die meisten gebräuchlichen Architekturen verwenden einzeln adressierbare 8-Bit-Bytes, so dass char
-Objekte normalerweise einem einzelnen 8-Bit-Byte zugeordnet werden.
Gewöhnlich.
In der Vergangenheit waren native Byte-Größen zwischen 6 und 9 Bit breit. In C muss der char
-Typ mindestens 8 Bits breit sein, um alle Zeichen im Basiszeichensatz darzustellen, also um eine Maschine mit 6-Bit-Bytes zu unterstützen, die ein Compiler haben kann um ein char
-Objekt auf zwei native Maschinen-Bytes abzubilden, wobei CHAR_BIT
12 ist. sizeof (char)
ist immer noch 1, daher werden Typen mit der Größe N
auf 2 * N
native Bytes abgebildet.
1. Der grundlegende Zeichensatz besteht aus allen 26 englischen Buchstaben in Groß- und Kleinschreibung, 10 Ziffern, Interpunktionszeichen und anderen grafischen Zeichen sowie Steuerzeichen wie Zeilenumbrüche, Tabulatoren, Seitenvorschübe usw., die alle bequem in 8 passen Bits.
Tags und Links c language-lawyer char