Warum ist die Größe von (int) == sizeof (long)?

7

In dem unten aufgeführten Programm sind die Größe von (int) und sizeof (lang) auf meinem Rechner gleich (beide gleich 4 Bytes (oder 32 Bits)). Ein langer, soweit ich weiß, ist 8 Bytes. Ist das richtig? Ich habe eine 64-Bit-Maschine

%Vor%     
ChrisMcJava 19.09.2013, 17:15
quelle

4 Antworten

18
  

A long, soweit ich weiß, sind 8 Bytes. Ist das korrekt?

Nein, das ist nicht korrekt. Die C- und C ++ - Spezifikationen geben nur an, dass long größer als oder gleich 32 Bits sein muss. int kann kleiner sein, aber auf vielen Plattformen in C und C ++ sind long und int beide 32 Bits.

Dies ist ein sehr guter Grund, ganzzahlige Typen mit fester Breite zu bevorzugen , wie z. B. int64_t , wenn sie dies tun stehen Ihnen zur Verfügung und Sie verwenden C99 oder ein Framework, das Ihnen einen äquivalenten Typ zur Verfügung stellt.

    
Reed Copsey 19.09.2013, 17:18
quelle
4

C ist weder Java noch C #. Wie andere schrieben, gibt die C-Spezifikation Mindestlängen und relative Längen an. Warum? C wurde entwickelt, um Low-Level-und kompilieren und laufen auf praktisch jeder Hardware jemals gemacht.

Wenn eine Spezifikation dem Programmierer zu viel verspricht, kann die Implementierung schwierig werden (und langsam), wenn die Hardware dies nicht unterstützt. Java- und C # -Entwicklern ist es egal, sie mögen den Komfort ihrer Sprachen für höhere Jobs und zögern nicht, große virtuelle Maschinen zu installieren, die sich darum kümmern, alle Versprechen (oder zumindest die meisten) zu erfüllen.

C-Programmierer möchten sogar auf Maschinenbefehlsebene die Kontrolle über den Code behalten. Volle Kontrolle über die Hardware. Nur so können alle Hardwarefunktionen genutzt und maximale Performance erreicht werden. Aber Sie müssen vorsichtig mit Ihren Annahmen über die Hardware sein, die Sie verwenden. Wie immer kommt mit großer Kraft große Verantwortung.

Nur um das zu verdeutlichen: C geht nicht von 8-Bit-Bytes aus. Siehe CHAR_BIT in <limits.h> .

Eine verwandte Frage ist Größe einer Ganzzahl in C .

    
Palec 19.09.2013 17:44
quelle
3

Es hängt von Ihrem ABI ab. Wenn Sie Windows verwenden, hat Microsoft ein LLP64-Modell ausgewählt, also sind long und int beide 32-Bit, während long long und Zeiger 64-Bit-Builds sind, aus Legacy-Gründen.

Die meisten UNIX-Plattformen haben ein LP64-Modell gewählt, das für 64-Bit-Builds int 32-bit, long , long long und Pointer 64-bit macht.

Aber, wie Reed Copsey bemerkt, gibt der Standard nur minimale Längen und relative Längen an. Und long muss größer oder gleich der Länge von int sein.

    
chmeee 19.09.2013 17:22
quelle
3

Nein, der Standard definiert die Mindestwerte für long ist 4 bytes und int ist 2 bytes . Wie im Entwurfsstatus C99 Abschnitt 5.2.4.2.1 Größen Integer-Typen Absatz 1 sagt:

  

[...] Ihre implementierungsdefinierten Werte müssen gleich oder größer sein als [...]

und für long haben wir:

%Vor%

was 4 bytes ist. Der Vollständigkeit halber haben wir folgendes für int :

%Vor%

was 2 bytes ist.

    
Shafik Yaghmour 19.09.2013 17:22
quelle

Tags und Links