Stimmt es immer, dass long int
(was meines Wissens ein Synonym für ist long
) 4
Bytes sind?
Kann ich mich darauf verlassen? Wenn nicht, könnte dies für ein POSIX-basiertes Betriebssystem zutreffen?
Stimmt es immer, dass long int
(was meines Wissens ein Synonym für ist long
) 4
Bytes sind?
Kann ich mich darauf verlassen? Wenn nicht, könnte dies für ein POSIX-basiertes Betriebssystem zutreffen?
long
s in ihren Definitionen, aber sie müssen nicht 64-Bit sein. Daher entschied sich MS für long
32-Bit, um Strukturen in ihren ABIs und für vorhandene Codebasen gleich groß zu halten.
Antworten:
Die Standards sagen nichts über die genaue Größe von Ganzzahltypen aus char
. In der Regel long
ist dies 32-Bit auf 32-Bit-Systemen und 64-Bit auf 64-Bit-Systemen.
Der Standard legt jedoch eine Mindestgröße fest . Aus Abschnitt 5.2.4.2.1 des C-Standards :
1 Die unten angegebenen Werte sind durch konstante Ausdrücke zu ersetzen, die für die Verwendung in
#if
Vorverarbeitungsrichtlinien geeignet sind . Darüber hinaus wird mit Ausnahme vonCHAR_BIT
undMB_LEN_MAX
das Folgende durch Ausdrücke ersetzt, die denselben Typ haben wie ein Ausdruck, der ein Objekt des entsprechenden Typs ist, der gemäß den ganzzahligen Beförderungen konvertiert wurde. Ihre implementierungsdefinierten Werte müssen gleich oder größer (absoluter Wert) sein als die angegebenen Werte mit demselben Vorzeichen....
Mindestwert für ein Objekt vom Typ
long int
LONG_MIN
-2147483647 // - (2 ^ 31−1)Maximalwert für ein Objekt vom Typ
long int
LONG_MAX
+2147483647 // 2 ^ 31−1
Dieses besagt , dass ein long int
muss ein Minimum von 32 Bit sein, kann aber größer sein. Auf einem Computer mit CHAR_BIT
8 ergibt dies eine minimale Bytegröße von 4. Auf einem Computer mit z. B. CHAR_BIT
16 kann a long int
jedoch 2 Byte lang sein.
Hier ist ein Beispiel aus der Praxis. Für den folgenden Code:
#include <stdio.h>
int main ()
{
printf("sizeof(long) = %zu\n", sizeof(long));
return 0;
}
Ausgabe unter Debian 7 i686:
sizeof (long) = 4
Ausgabe unter CentOS 7 x64:
sizeof (long) = 8
Nein, Sie können keine Annahmen zur Größe treffen. Wenn Sie einen Typ einer bestimmten Größe benötigen, können Sie die in definierten Typen verwenden stdint.h
. Es definiert die folgenden Typen:
int8_t
: 8-Bit signiertuint8_t
: vorzeichenloses 8-Bitint16_t
: 16-Bit signiertuint16_t
: vorzeichenloses 16-Bitint32_t
: signiertes 32-Bituint32_t
: 32-Bit ohne Vorzeichenint64_t
: 64-Bit signiertuint64_t
: 64-Bit ohne VorzeichenDer stdint.h
Header ist in Abschnitt 7.20 der Norm beschrieben, die genauen Breitentypen in Abschnitt 7.20.1.1. Der Standard besagt, dass diese Typedefs optional sind, aber in den meisten Implementierungen vorhanden sind.
1 == sizeof(char) == sizeof(int)
. Könnten Sie ein spezifisches Zitat aus dem Standard angeben, das besagt, dass " int
mindestens 2 Bytes sind" ?
char
kann größer als 8 Bit sein. Wenn es beispielsweise 32 Bit sind ( sizeof
natürlich immer noch 1), ist die Arbeit mit Daten wie 8-Bit-Textcodierungen schmerzhaft, aber im Allgemeinen werden solche Plattformen nicht für die Textverarbeitung verwendet.
long
normalerweise 64-Bit ist, da es nicht unter Windows läuft und Windows weit verbreitet ist. Der Standard selbst definiert dies natürlich nicht, daher sind beide Implementierungen standardkonform, aber das Endergebnis sind Tonnen von Unix-C- (und C ++) Code, der 64-Bit-Zeiger unter Windows abschneidet (hören Sie einfach auf, Zeiger bereits in ganzen Zahlen zu speichern Verdammt !: D). Natürlich wird dies im Wesentlichen durch die Verwendung eines Typs verursacht, der standardmäßig einen Bereich von [−2147483647, +2147483647] hat, um Werte zu speichern, die größer als diese sind, was irgendwie lächerlich ist, aber
Nein, weder der C-Standard noch POSIX garantieren dies, und tatsächlich verfügen die meisten Unix-ähnlichen 64-Bit-Plattformen über 64 Bit (8 Byte) long
.
Verwenden Sie Code sizeof(long int)
und überprüfen Sie die Größe. Auf dem System, auf dem Sie gerade arbeiten, erhalten Sie die Größe von long int in Byte. Die Antwort auf Ihre Frage lautet insbesondere NEIN. Es ist nirgends in C oder in POSIX oder irgendwo garantiert.
sizeof(long int)
Faktoren Polsterung und Ausrichtung Einschränkungen in das Ergebnis. Es ist vollkommen gültig sizeof
, "16" zurückzugeben, selbst wenn Sie nur vier dieser Bytes verwenden dürfen.
Wie von @delnan hervorgehoben, behalten POSIX-Implementierungen die Größe von long
und int
wie nicht angegeben bei und unterscheiden sich häufig zwischen 32-Bit- und 64-Bit-Systemen.
Die Länge von long
hängt hauptsächlich von der Hardware ab (häufig passend zur Größe der Datenregister auf der CPU und manchmal auch zu anderen softwarebezogenen Problemen wie dem Betriebssystemdesign und der ABI-Schnittstelle).
Es sizeof
ist keine Funktion, sondern eine Compiler-Direktive *, sodass Ihr Code bei der Verwendung keine Operationen verwendet sizeof
- es ist dasselbe wie das Schreiben einer Zahl, nur dass er portabel ist.
verwenden:
sizeof(long int)
* Wie Dave in den Kommentaren hervorhob, sizeof
wird zur Laufzeit berechnet, wenn es unmöglich ist, den Wert während der Kompilierung zu berechnen, z. B. wenn Arrays mit variabler Länge verwendet werden.
sizeof
Berücksichtigt auch, wie in einem anderen Kommentar ausgeführt, die von der Implementierung verwendete Auffüllung und Ausrichtung, was bedeutet, dass die tatsächlich verwendeten Bytes von der Größe im Speicher abweichen können (dies kann beim Verschieben von Bits wichtig sein).
Wenn Sie nach Variablen stdint.h
mit bestimmter Bytegröße suchen, sollten Sie ein Bytearray oder (ich würde davon ausgehen, dass dies unterstützt wird) die von C99 in definierten Typen verwenden - wie von @dbush vorgeschlagen.
usually
auf mostly
und eine Info in Klammern hinzuzufügen.
sizeof
es sich um eine Compiler-Direktive handelt, um alle wahrgenommenen Gründe zu beseitigen, die jemand für das Erraten der Größe haben könnte.
sizeof
Wird zur Laufzeit berechnet, wenn (und wenn) Sie ein Array mit variabler Länge oder einen variabel modifizierten Typ in C99 oder höher verwenden (oder 'gnu89' als GCC-Erweiterung), aber der meiste Code tut dies nicht.
Als wir C zum ersten Mal auf Hardware der ICL-Serie 39 implementiert haben, haben wir den Standard beim Wort genommen und die Datentypen der natürlichen Darstellung auf dieser Maschinenarchitektur zugeordnet, die short
= 32 Bit, int
= 64 Bit, long
= 128 Bit war.
Wir haben jedoch festgestellt, dass keine ernsthaften C-Anwendungen funktionieren. Sie alle nahmen das Mapping short
= 16, int
= 32, long
= 64 an, und wir mussten den Compiler ändern, um dies zu unterstützen.
Was auch immer der offizielle Standard sagt, seit vielen Jahren konvergiert jeder auf long
= 64 Bit und es ist unwahrscheinlich, dass sich dies ändert.
Der Standard sagt nichts über die Größe von aus long int
, daher hängt er von der Umgebung ab, die Sie verwenden.
Um die Größe long int
Ihrer Umgebung zu ermitteln, können Sie den sizeof
Operator verwenden und die Größe von ermitteln long int
. Etwas wie
sizeof(long int)
Der C-Standard erfordert nur die folgenden Punkte zu den Größen der Typen
- int> = 16 Bit,
- lang> = 32 Bit,
- lang lang (seit C99)> = 64 Bit
- sizeof (char) <= sizeof (kurz) <= sizeof (int) <= sizeof (lang) <= sizeof (lang lang)
- sizeof (char) == 1
- CHAR_BIT> = 8
Die übrigen sind definierte Implementierungen, daher ist es nicht verwunderlich, wenn man auf Systeme stößt, in denen int 18/24/36/60 Bits hat, die komplement-signierte Form, sizeof (char) == sizeof (short) == sizeof (int) == sizeof (long) == 4, 48-Bit lang oder 9-Bit-Zeichen wie exotische Architekturen, die den Standardausschüssen am Herzen liegen, und Liste der Plattformen, die vom C-Standard unterstützt werden
Der obige Punkt über long int ist völlig falsch. Die meisten Linux / Unix-Implementierungen definieren Long als 64-Bit-Typ, aber es sind nur 32 Bit in Windows, da sie unterschiedliche Datenmodelle verwenden (siehe Tabelle hier 64-Bit-Computing ), und dies ist unabhängig von 32 oder 64-Bit OS Version.
Der Compiler bestimmt die Größe basierend auf dem Hardwaretyp und dem Betriebssystem.
Daher sollten keine Annahmen bezüglich der Größe getroffen werden.
Nein, das können Sie nicht annehmen, da die Größe des "langen" Datentyps von Compiler zu Compiler unterschiedlich ist. Weitere Informationen finden
Sie in diesem Artikel.
Kurze Antwort: Nein! Sie können keine festen Annahmen über die Größe von treffen long int
. Weil der Standard (C-Standard oder POSIX) die Größe von nicht dokumentiertlong int
(wie wiederholt betont). Um nur ein Gegenbeispiel zu Ihrer Überzeugung zu liefern, haben die meisten 64-Bit-Systeme die long
Größe 64! Um die Portabilität zu maximieren, verwenden Sie sie sizeof
angemessen.
Verwenden Sie sizeof(long int)
diese Option , um die Größe zu überprüfen. Sie gibt die Größe long
in Byte zurück. Der Wert ist system- oder umgebungsabhängig. Das heißt, der Compiler bestimmt die Größe basierend auf der Hardware und dem Betriebssystem.
Aus Usrmiscs Blog:
Der Standard überlässt es vollständig dem Compiler, was auch bedeutet, dass derselbe Compiler es von Optionen und Zielarchitektur abhängig machen kann.
Also kannst du nicht .
Übrigens long int
könnte sogar das gleiche sein wie long
.
sizeof
Polsterung und Ausrichtung berücksichtigt werden. Es ist standardkonform,sizeof(unsigned long)
8 Bytes zu haben, aber der Überlauf verhält sich wie 4 Bytes. Es ist völlig falsch zu versuchen, das Limit eines Integer-Typs zu verwendensizeof
undCHAR_BITS
zu berechnen. Verwenden Sie,limits.h
wenn es verwendet werden sollte.