Warum ist die sizeof(int) == sizeof(long)?
Im Programm aufgeführt sind unten, sizeof(int) und sizeof(long) sind gleich auf meinem Rechner (beide gleich 4 bytes (oder 32 bits)). Eine lange, soweit ich weiß, ist 8 bytes. Ist das richtig? Ich habe ein 64-bit-Maschine
#include <stdio.h>
#include <limits.h>
int main(void){
printf("sizeof(short) = %d\n", (int)sizeof(short));
printf("sizeof(int) = %d\n", (int)sizeof(int));
printf("sizeof(long) = %d\n", (int)sizeof(long));
printf("sizeof(float) = %d\n", (int)sizeof(float));
printf("sizeof(double) = %d\n", (int)sizeof(double));
printf("sizeof(long double) = %d\n", (int)sizeof(long double));
return 0;
}
- Siehe this
- Ich denke, die Ausgabe von code, der Ihre Frage beantwortet.
- Nun, ein code-Beispiel spricht nicht gegen die Norm, da Compiler kann nicht konform sein, kann die Umsetzung bestimmtes Verhalten oder möglicherweise Erweiterungen. So ein Beispiel im code nicht beweisen, was es sein sollte.
- seine Frage nicht erwähnt nichts über die Norm. Seine Frage war " Eine lange, soweit ich weiß, ist 8 bytes. Ist das richtig?' Die Antwort, offensichtlich aus seinem code, ist "Nein, die lange auf Ihrem Computer, mit Ihrem compiler, ist 4 bytes".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, das ist nicht korrekt. Die C-und C++ - Spezifikationen einzige Staat, der lange muss größer als oder gleich 32 bits sein.
int
kleiner sein können, aber auf vielen Plattformen in C und C++long
undint
sind beide 32-bit.Dies ist ein sehr guter Grund, um lieber Feste Breite integer-Typen wie
int64_t
wenn Sie verfügbar sind, und Sie sind mit C99 oder ein framework, welches Ihnen einen gleichwertigen Typ.sizeof(long)
8 bytes auf meiner sehr typischen 64b Maschine, also ich find "auf den meisten Rechnern" schwer zu akzeptieren.long
ist in eine C-Implementierung Ausrichtung der Maschine. Meinst dusizeof(long)
8 bytes in Ihrer sehr typischen C-Implementierung?long
auch auf 64-bit-Maschinen ist, hängt auch vom compiler und seine Optionen. Auf meiner 64-bit Maschine 4 von 4 Compiler standardmäßig sizeof(long) as 4. Ein compiler erlaubt Größe 8.Kommt es auf dein ABI. Wenn Sie Windows verwenden, entschied sich Microsoft eine LLP64 Modell, so
long
undint
sind sowohl 32-bit, währendlong long
und Zeiger sind 64-bit in 64-bit-builds, die für legacy-Gründen.Den meisten UNIX-Plattformen wählte eine LP64-Modell, das macht
int
32-bit,long
,long long
und Zeiger 64-bit, für 64-bit-builds.Aber, als Reed Copsey Notizen, die standard besagt lediglich minimale Längen und relativen Längen. Und
long
muss größer als oder gleich der Länge vonint
.C nicht Java, noch C#. Wie andere schrieben, C spec Staaten minimale Längen und relativen Längen. Warum? C wurde entwickelt, um low-level und zu kompilieren und laufen auf nahezu jeder hardware, die jemals gemacht.
Wenn ein spec verspricht der Programmierer zu viel, die Umsetzung könnte schwierig werden (und langsamer) wenn hardware nicht unterstützt wird ist so eine Sache. Java-und C# - Entwickler kümmern sich nicht zu viel, Sie mögen die Bequemlichkeit Ihrer Sprachen für höher-level-jobs und zögern Sie nicht, installieren Sie große virtuelle Maschinen, die kümmern sich um die Erfüllung aller Verheißungen (oder zumindest die meisten).
C-Programmierer wollen die Kontrolle über den code sogar auf Maschinenbefehl Ebene. Die vollständige Kontrolle über die hardware. Nur auf diese Weise können alle hardware-features verwendet werden, und die maximale Leistung erreicht werden. Aber Sie müssen vorsichtig sein mit Ihren Annahmen über die hardware, die Sie verwenden. Wie immer, mit großer macht kommt große Verantwortung.
Nur um zu verdeutlichen, dass: C nicht davon ausgegangen werden 8-bit-bytes. Sehen
CHAR_BIT
im<limits.h>
.Einen stellt sich die Frage, Größe eines integer in C.
Nein, die Norm definiert die Mindestanforderungen, die für
long
ist4 bytes
undint
ist2 bytes
. Wie pro die C99-standard-Entwurf Abschnitt5.2.4.2.1
Größen von integer-Typen Absatz 1 sagt:und für
long
wir haben:ist
4 bytes
. Der Vollständigkeits halber haben wir im folgenden fürint
:ist
2 bytes
.CHAR_BIT
werden, bis Sie es untersuchen.int
hat eine Reichweite von mindestens -32767 bis +32767. Wir können folgern aus der Reihe, dass seine Größe ist mindestens 16 bits, und wir können schließen, von der Reichweite und den Wert derCHAR_BIT
wie viele bytes es erfordert (foreignising padding-bits), aber das ist auch nicht direkt angegeben.long
undint
beide 1 byte groß ist (aber nur, wennCHAR_BIT >= 32
).CHAR_BIT
ist ausreichend groß (und das ist nicht unbekannt; DSPs Häufig fehlende Adressierung der kleinen Arten).