Besetzt eine Integer-Variable in C 2 Bytes oder 4 Bytes?
Dies hängt von der verwendeten Plattform und der Konfiguration Ihres Compilers ab. Die einzig maßgebliche Antwort besteht darin, mithilfe des sizeof
Operators zu ermitteln, wie groß eine Ganzzahl in Ihrer spezifischen Situation ist.
Von welchen Faktoren hängt es ab?
Die Reichweite sollte am besten berücksichtigt werden, anstatt die Größe . Beide variieren in der Praxis, obwohl es viel narrensicherer ist, Variablentypen nach Bereich als Größe auszuwählen, wie wir sehen werden. Es ist auch wichtig anzumerken, dass der Standard uns dazu ermutigt, die Auswahl unserer Ganzzahltypen eher nach Bereich als nach Größe in Betracht zu ziehen. Lassen Sie uns jedoch zunächst die Standardpraxis ignorieren und unsere Neugierde untersuchen sizeof
, Bytes CHAR_BIT
und Ganzzahldarstellung untersuchen das Kaninchenloch und sehen Sie es selbst ...
sizeof
, Bytes und CHAR_BIT
Die folgende Aussage aus dem C-Standard (oben verlinkt) beschreibt dies in Worten, von denen ich glaube, dass sie nicht verbessert werden können.
Der sizeof
Operator gibt die Größe (in Bytes) seines Operanden an, der ein Ausdruck oder der Name eines Typs in Klammern sein kann. Die Größe wird aus dem Typ des Operanden bestimmt.
Die Annahme eines klaren Verständnisses führt uns zu einer Diskussion über Bytes . Es wird allgemein angenommen, dass ein Byte aus acht Bits besteht, obwohl tatsächlich angegeben CHAR_BIT
wird, wie viele Bits in einem Byte enthalten sind . Dies ist nur eine weitere dieser Nuancen, die bei der Betrachtung der gemeinsamen Zwei- (oder Vier-) Byte-Ganzzahlen nicht berücksichtigt wird .
Lassen Sie uns die Dinge so weit zusammenfassen:
sizeof
=> Größe in Bytes und
CHAR_BIT
=> Anzahl der Bits im Byte
Je nach System kann sizeof (unsigned int)
also jeder Wert größer als Null sein (nicht nur 2 oder 4), als wäre er CHAR_BIT
16, dann enthält ein einzelnes (16-Bit-) Byte genügend Bits, um die durch die beschriebene 16-Bit-Ganzzahl darzustellen Standards (unten angegeben). Das sind nicht unbedingt nützliche Informationen, oder? Lassen Sie uns tiefer eintauchen ...
Ganzzahlige Darstellung
Der C-Standard gibt hier die Mindestgenauigkeit / den Mindestbereich für alle Standard-Integer-Typen (und CHAR_BIT
auch fwiw) an . Daraus können wir ein Minimum ableiten, wie viele Bits zum Speichern des Werts erforderlich sind , aber wir können unsere Variablen auch einfach basierend auf Bereichen auswählen . Dennoch befindet sich hier ein großer Teil der für diese Antwort erforderlichen Details. Zum Beispiel Folgendes, dass der Standard unsigned int
(mindestens) 16 Bit Speicher benötigt:
UINT_MAX 65535 // 2¹⁶ - 1
Somit können wir sehen, unsigned int
dass ( mindestens ) 16 Bit erforderlich sind. Hier erhalten Sie die zwei Bytes (unter der Annahme von CHAR_BIT
8) ... und später, als diese Grenze auf erhöht wurde 2³² - 1
, gaben die Leute stattdessen 4 Bytes an. Dies erklärt die Phänomene, die Sie beobachtet haben:
Die meisten Lehrbücher sagen, dass ganzzahlige Variablen 2 Bytes belegen. Wenn ich jedoch ein Programm ausführe, das die aufeinanderfolgenden Adressen eines Arrays von Ganzzahlen druckt, wird der Unterschied von 4 angezeigt.
Sie verwenden ein altes Lehrbuch und einen Compiler, die Ihnen nicht tragbares C beibringen. Der Autor, der Ihr Lehrbuch geschrieben hat, weiß es vielleicht gar nicht CHAR_BIT
. Sie sollten Ihr Lehrbuch (und Ihren Compiler) aktualisieren und sich daran erinnern, dass die IT ein sich ständig weiterentwickelndes Feld ist, dem Sie im Wettbewerb immer einen Schritt voraus sein müssen ... Genug davon; Mal sehen, welche anderen nicht portablen Geheimnisse die zugrunde liegenden Integer-Bytes speichern ...
Wertbits sind das, was die häufigsten Missverständnisse zu zählen scheinen. Im obigen Beispiel wird ein unsigned
ganzzahliger Typ verwendet, der normalerweise nur Wertbits enthält, sodass der Teufel im Detail leicht übersehen werden kann.
Vorzeichenbits ... Im obigen Beispiel habe ich UINT_MAX
als Obergrenze angegeben, unsigned int
da dies ein triviales Beispiel ist, um den Wert 16
aus dem Kommentar zu extrahieren . Bei vorzeichenbehafteten Typen müssen wir auch das Vorzeichenbit einschließen, um zwischen positiven und negativen Werten zu unterscheiden (das ist das Vorzeichen).
INT_MIN -32768 // -(2¹⁵)
INT_MAX +32767 // 2¹⁵ - 1
Auffüllen von Bits ... Während es nicht üblich ist, auf Computer zu stoßen, die Auffüllbits in ganzen Zahlen enthalten, lässt der C-Standard dies zu. Einige Maschinen (dh diese ) implementieren größere Ganzzahltypen, indem sie zwei kleinere (vorzeichenbehaftete) Ganzzahlwerte miteinander kombinieren. Wenn Sie vorzeichenbehaftete Ganzzahlen kombinieren, erhalten Sie ein verschwendetes Vorzeichenbit. Dieses verschwendete Bit wird in C als Auffüllen betrachtet . Andere Beispiele für Auffüllen von Bits können Paritätsbits und Trap-Bits umfassen .
Wie Sie sehen können, scheint der Standard die Berücksichtigung von Bereichen wie INT_MIN
.. INT_MAX
und anderen Minimal- / Maximalwerten aus dem Standard bei der Auswahl von Ganzzahltypen zu fördern , und rät davon ab, sich auf Größen zu verlassen, da andere subtile Faktoren wahrscheinlich vergessen werden, wie z. B. CHAR_BIT
und Auffüllen von Bits, die Dies kann sich auf den Wert von auswirken sizeof (int)
(dh die häufigen Missverständnisse von Zwei-Byte- und Vier-Byte-Ganzzahlen vernachlässigen diese Details).