Warum hat “long int” die gleiche Größe wie “int”? Funktioniert dieser Modifikator überhaupt?

Lesezeit: 2 Minuten

Benutzeravatar von Kosmo零
Kosmo零

Ehm.. Irgendwie mag ich diese Modifikatoren lang / kurz erweitert / reduziert die Menge des zugewiesenen Speichers, wenn Variablen erstellt werden, aber …

#include <stdio.h>

#define test_int int
#define long_int long int
#define long_long_int long long int

void main()
{
    printf("%i\n", sizeof (test_int)); //output 4
    printf("%i\n", sizeof (long_int)); //output 4. Why? wasn't I modified it's size?
    printf("%i\n", sizeof (long_long_int)); //output 8
}

Aus unbekannten Gründen druckt es die Größe von int und lang int als gleich. Ich verwende vc++ 2010 Express Edition. Entschuldigung, schwer zu findende Antwort in Google, es wird immer angezeigt lang und int als eigenständige Typen.

  • Warum sollte nicht die Größen sind gleich?! Die Typen sind verschieden, das ist alles, was zählt. Jeder Typ kann eine Reihe von Werten darstellen, die vom Standard vorgeschrieben sind, aber es steht ihm frei, mehr als das darzustellen.

    – Kerrek SB

    21. August 2013 um 9:04 Uhr

  • Was ist lang Modifikator tut dann? Soll es nicht die Menge des zugewiesenen Speichers erweitern?

    – Kosmo零

    21. August 2013 um 9:05 Uhr

  • Soweit ich weiß, sagt der Standard nur, dass long mindestens so lang wie integer ist. Es kann nicht kürzer sein, muss aber nicht mehr als int sein. Alles andere ist maschinenabhängig.

    – zubergu

    21. August 2013 um 9:07 Uhr


  • Die obligatorischen Bereiche darstellbarer Werte sind in dieser Antwort angegeben. Bemerkenswert: short ist mindestens 16 Bit, long int mindestens 32, und long long int mindestens 64 Bit. Alles andere ist nicht spezifiziert. Zum Beispiel könnte eine Plattform sehr gut haben jeder Typ 256 Bit lang sein, und somit sizeof jeder Typ wäre 1.

    – Kerrek SB

    21. August 2013 um 9:08 Uhr


  • Tatsächlich ist die gesamte Website sehr schlecht. Ich habe auf jeder geöffneten Seite ein oder zwei schwerwiegende Fehler gefunden.

    – James Kanze

    21. August 2013 um 9:37 Uhr

Der Grund, den MS gewählt hatlong 32 Bit auch auf einem 64-Bit-System ist, dass die vorhandene Windows-API aus historischen Gründen eine Mischung aus verwendet int und long für ähnliche Dinge, und die Erwartung ist, dass dies ein 32-Bit-Wert ist (einige davon gehen auf Zeiten zurück, als Windows ein 16-Bit-System war). Um also den alten Code in die neue 64-Bit-Architektur umzuwandeln, entscheiden sie sich dafür, ihn beizubehalten long bei 32 Bit, so dass sich Anwendungen vermischen int und long an verschiedenen Stellen würde noch kompilieren.

Es gibt nichts im C++-Standard, das vorschreibt, dass a long sollte größer sein als int (Es ist sicherlich nicht auf den meisten 32-Bit-Systemen). Alles, was der Standard sagt, ist, dass die Größe von short <= int <= long – und das short ist mindestens 16 Bit, wenn der Speicher dient [not necessarily expressed as “should be at least 16 bits”, I think it mentions the range of values].

  • Tatsächlich erwähnt es das short sollte mindestens von -32767 bis +32767 halten. Beachten Sie, dass der Standard nicht -32768 vorschreibt (niedrigster Wert für eine 16-Bit-Zahl in 2er Komplement), weil Sie angeben, wie negative Zahlen behandelt werden sollen.

    – Medinoc

    21. August 2013 um 9:42 Uhr

  • Vielen Dank, Mats, aber es scheint, dass es in den letzten 30 Jahren als ein weiterer Alias ​​​​für int verwendet wurde! wenn es nicht größer sein soll, warum sollte man es überhaupt im Standard erwähnen! Es macht einfach keinen Sinn, in großen Compilern und Systemen etwas mit dem Namen long zu haben, und das nicht ein einziges Mal in 30 Jahren, und nicht mehr Platz als int bietet! Das ist lächerlich, Alle neuen Sprachen haben eine bedeutungsvolle Semantik, C++ ist in allem, was es scheint, eine Ausnahme!

    – Hossein

    17. Dezember 2014 um 3:48 Uhr


  • @Hossein: Vor 30 Jahren hatten viele Compiler int als 16-Bit-Wert und long war 32. Heutzutage wird auf Nicht-Windows-Plattformen mit 64-Bit-Prozessoren long ist in der Tat 64 Bit, wo int ist 32 Bit. Aber der Hauptpunkt ist, dass es keine GARANTIE gibt, dass der Typ eine bestimmte Größe hat long, außer einem Minimum von 32 Bit. Es liegt dann am Compiler, ob es größer ist oder nicht.

    – Mats Petersson

    17. Dezember 2014 um 8:01 Uhr

  • @Hossein C und C ++ werden beide auf vielen verschiedenen Systemen verwendet, es gibt viele Nicht-Windows-Systeme, bei denen a long 64 Bit ist. Es gibt Systeme, bei denen ein int 16 Bit und ein long 32 Bit hat.

    – Nr

    11. Februar 2017 um 9:53 Uhr


  • Wow, huh, diese Hölle ist eigentlich nur für Windows. Unter macOS beträgt die Länge wie erwartet mindestens 8 Bytes.

    – Atombit

    2. Januar 2019 um 23:13 Uhr

Alles, was die Norm verlangt, ist Folgendes:

sizeof(char) == 1

und

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

(und dass die entsprechenden unsignierten Typen die gleiche Größe wie die signierten Typen haben).

Darüber hinaus gibt es für jeden Typ Mindestgrößen, die indirekt durch Grenzwerte für die Werte von angegeben werden INT_MAXusw.: a char
muss mindestens 8 Bit sein, a short und ein int 16, ein long 32 und ein long long 64.

Auf 16-Bit-Plattformen ist es für beide üblich short und int 16 Bit sein; auf 32-Bit-Plattformen (und den noch existierenden 36- und 48-Bit-Plattformen), int und long sind fast immer gleich groß. Auf modernen 64-Bit-Plattformen (mit Byte-Adressierung) wäre die vernünftige Lösung, allen vier Typen unterschiedliche Größen zu geben (obwohl man argumentieren könnte, dass gemäß dem Standard
int sollte 64 Bit sein, was das bedeuten würde int, long und long
long
alle hatten die gleiche Größe).

C- und C++-Implementierungen ist ein long größer oder gleich einem int. Die heute beliebtesten Desktop-Plattformen wie Windows und Linux laufen hauptsächlich auf 32-Bit-Prozessoren, und die meisten Compiler für diese Plattformen verwenden ein 32-Bit-Int, das die gleiche Größe und Darstellung wie ein Long hat.

  • Das ist falsch, long ist „so groß oder größer als int“. Keine Notwendigkeit, größer zu sein.

    – Mats Petersson

    21. August 2013 um 9:11 Uhr

  • @MatsPetersson sizeof (int) <= sizeof(long). Für 32 Bit ist es gleich, aber für 64 Bit ist es anders.

    – Tagesrai

    21. August 2013 um 9:13 Uhr


  • Auf 64-Bit kann es anders sein. Es befindet sich beispielsweise nicht auf einem Windows-Computer.

    – Mats Petersson

    21. August 2013 um 9:13 Uhr

Benutzeravatar von iampranabroy
iampranabroy

In einem 64-Bit-Compiler haben sowohl int als auch log int 4 Bytes.

Wenn Sie sich in Windows befinden, gehen Sie den folgenden Link durch:
http://msdn.microsoft.com/en-us/library/s3f49ktz%28v=vs.90%29.aspx

Möglicherweise finden Sie einige Informationen in einer anderen Diskussion: Was ist die Bitgröße von long unter 64-Bit-Windows?

Benutzeravatar von xen-0
xen-0

Hier ist die Bestellung

char
short (int)
int
long (int)
long long (int)

Das verlangt die Norm sizeof(char) == 1 ist wahr. Die Norm fordert außerdem Folgendes: int ist mindestens 16 Bit. long int ist mindestens 32 Bit und long long int ist mindestens 64 Bit.

Da 32-Bit-Prozessoren Mainstream sind, werden Compiler normalerweise eingestellt int 4 Bytes sein. Die Erweiterung ist auf 64-Bit-Systemen (für MSVC sowieso) aus Kompatibilitätsgründen nicht mehr aufgetreten.

  • urgh, vielleicht dachte ich deshalb, long int sollte mich mehr als int. als ich c++ lernte, begann ich mit borland c++ 3.1

    – Kosmo零

    21. August 2013 um 9:21 Uhr

  • C erfordert auch, dass int mindestens 16 Bit und long mindestens 32 Bit groß sind.

    – Kartoffelklatsche

    21. August 2013 um 9:21 Uhr

  • Ich bin mir nicht sicher, ob Sie das sagen könnten int war schon mal “typisch” 16 Bit. Damals, als 16 Bit int war üblich, Maschinen variierten viel mehr und es gab wahrscheinlich genauso viele, die 32 Bit hatten int (und zumindest einige, die 36 Bit hatten intoder andere Varianten, die heute als exotisch gelten würden).

    – James Kanze

    21. August 2013 um 9:23 Uhr

  • Und mit Ausnahme von MSVC haben 64-Bit-Systeme 8 Byte long.

    – James Kanze

    21. August 2013 um 9:24 Uhr

  • “außer MSVC” ist eine falsche Bezeichnung. Für den Anfang gilt IIRC das gleiche für MinGW; dann bezweifle ich, dass Win64 das einzige ist LLP64 (long long und Zeiger 64-Bit) Plattform.

    – Medinoc

    21. August 2013 um 9:45 Uhr

Der Punkt ist, dass Sie die Bedeutung von int und long falsch verstehen (das ist kein Adjektiv).

Was der Standard definiert, ist, dass die Anzahl der Bits in jedem Typ erfordert, dass diese Beziehung bestehen bleibt:

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long).

intallein, kann so lang sein wie a short bis so lange a long je nachdem, wie die Umsetzung konzipiert ist.

Compiler-Designer neigen dazu, die Leistung von zu maximieren int Arithmetik, wodurch es die natürliche Größe für den zugrunde liegenden Prozessor oder das zugrunde liegende Betriebssystem erhält und die anderen Typen entsprechend eingerichtet werden.

Aber die Verwendung von long intseit int kann weggelassen werden, es ist genauso wie long per Definition.

  • urgh, vielleicht dachte ich deshalb, long int sollte mich mehr als int. als ich c++ lernte, begann ich mit borland c++ 3.1

    – Kosmo零

    21. August 2013 um 9:21 Uhr

  • C erfordert auch, dass int mindestens 16 Bit und long mindestens 32 Bit groß sind.

    – Kartoffelklatsche

    21. August 2013 um 9:21 Uhr

  • Ich bin mir nicht sicher, ob Sie das sagen könnten int war schon mal “typisch” 16 Bit. Damals, als 16 Bit int war üblich, Maschinen variierten viel mehr und es gab wahrscheinlich genauso viele, die 32 Bit hatten int (und zumindest einige, die 36 Bit hatten intoder andere Varianten, die heute als exotisch gelten würden).

    – James Kanze

    21. August 2013 um 9:23 Uhr

  • Und mit Ausnahme von MSVC haben 64-Bit-Systeme 8 Byte long.

    – James Kanze

    21. August 2013 um 9:24 Uhr

  • “außer MSVC” ist eine falsche Bezeichnung. Für den Anfang gilt IIRC das gleiche für MinGW; dann bezweifle ich, dass Win64 das einzige ist LLP64 (long long und Zeiger 64-Bit) Plattform.

    – Medinoc

    21. August 2013 um 9:45 Uhr

1433190cookie-checkWarum hat “long int” die gleiche Größe wie “int”? Funktioniert dieser Modifikator überhaupt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy