2013-12-21 3 views
15

Ich habe mich nur gefragt, wie kann ich wissen, ob mein Laptop 64 oder 32-Bit-Maschine ist. (Es ist ein 64).Größe von int und sizeof Zeiger auf einer 64-Bit-Maschine

So, dachte ich über das Drucken die folgenden:

int main() 
{ 
printf("%d",sizeof(int)); 
} 

und das Ergebnis war 4, die seltsam schien (da es sich um eine 64-Bit-Maschine)

Aber, wenn ich das gedruckt:

int main() 
{ 
printf("%d",sizeof(int*)); 
} 

das Ergebnis war 8, was mehr Sinn machte.

Die Frage ist:

Da ich ein 64-Bit-Computer verwenden, sollte keinen primitiven Typen wie int 8 Byte

(64 Bit) und von diesem sizeof int verwenden sollte, sollte sein 8? Warum ist es nicht so?

Und warum ist die int * -Größe 8?

Ein bisschen hier verwirrt,

so Dank im Voraus.

+7

Verwenden '% d' nicht zum Drucken von' size_t', ruft sie UB. –

+1

http://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models – Mat

+1

Die 64-Bit-Architektur ändert das Ganzzahlmodell im Vergleich zu 32 Bit nicht. Nur Adresse/Zeigerlänge. – user2672165

Antwort

18

Nein, die sizeof(int) ist Implementierung definiert und ist normalerweise 4 Bytes.

Um mehr als 4 GB Speicher (32-Bit-Systeme können) zu adressieren, müssen Sie Ihre Zeiger jedoch 8 Bytes breit sein. int* hält nur die Adresse auf "irgendwo im Speicher", und Sie können nicht mehr als 4 GB Speicher mit nur 32 Bits adressieren.

+2

Hinweis: Speicher für Code, konstante Daten, Stack, dynamische Daten, verschiedene Datentypen usw. könnte in separaten implizierte _Segments_ oder Adressräume existieren, so die Adresse für jedes könnte 32 Bit und _jeach_ 4 GB haben. Also insgesamt über 4GB. Dieses Modell bedeutet, dass eine Funktionsadresse und eine Datenadresse den gleichen "Wert" haben, jedoch anders verglichen werden, wenn sich ihre implizierten Segmente unterscheiden. Betrachten Sie [Harvard-Architektur] (https://en.wikipedia.org/wiki/Harvard_Architektur), die bei verschiedenen eingebetteten Prozessoren beliebt ist. C ist für viele Adressschemata übertragbar. – chux

+0

Bedeutet dies, dass es speichereffizienter ist, "int * t = malloc (sizeof (int))" anstelle von "int i = 1; int * t = & i'? – wulfgarpro

15

Größe eines Zeigers sollte 8 Byte auf jedem 64-Bit-C/C++ - Compiler sein, aber das gleiche gilt nicht für die Größe von int.

Die wiki hat eine gute Erklärung dazu:

In vielen Programmierumgebungen für C und C abgeleiteten Sprachen auf 64-Bit-Maschinen, "int" Variablen sind immer noch 32 Bit breit, aber lange Integer und Zeiger sind 64 Bits breit. Diese werden als LP64-Datenmodell beschrieben. Eine weitere Alternative ist das ILP64-Datenmodell in , bei dem alle drei Datentypen 64 Bits breit sind, und sogar SILP64, wobei "kurze" Ganzzahlen ebenfalls 64 Bits breit sind. In den meisten Fällen sind die erforderlichen Modifikationen jedoch relativ gering und einfach, und viele gut geschriebene Programme können einfach für die neue Umgebung ohne Änderungen neu kompiliert werden. Eine andere Alternative ist das LLP64-Modell, das die Kompatibilität mit 32-Bit-Code unter Beibehaltung von int und lang als 32-Bit aufrechterhält. "LL" bezieht sich auf den "long long integer" -Typ , der auf allen Plattformen mindestens 64 Bit umfasst, einschließlich 32-Bit-Umgebungen.

3

Die sizeof(int), sizeof(int*) und „Maschinengröße“, wenn auch oft miteinander korreliert sind, können jeweils als die anderen unabhängig voneinander kleiner, gleich oder größer sein.Über die einzige C-Anforderung ist, dass sie mindestens 16 Bit (oder so) sind - anders als das, Compiler abhängig für die sizeof(int), sizeof(int*).

(Obwohl möglicherweise ein Zeiger muss mindestens eine int Größe sein. Hmmm)

+0

warum gibt sizeof (char *) in einigen Fällen auch "8"? –

+0

@UdhavKalra 'sizeof (char *)' ist 8 in einigen Fällen, weil die Größe eines Zeigers zu 'char' 8 ist. Es könnte 4, 2 oder sogar 1, 3 oder 6 auf neueren Plattformen sein. Was ist mit 8 findest du fragwürdig? – chux

+0

Ich habe gerade sizeof (int *) (char *) getestet, auf meiner Plattform gab es nur 8. Also, ich dachte, was könnte der Grund dafür sein? –

2

Programmierer wie Integer-Typen von 1 bis, 2, 4 und 8 Byte oder 8, 16, 32 und 64 Bit. Es gibt nur zwei Integer-Typen, die kleiner als int sein können: char und short. Wenn int 64 Bits wären, könnten Sie nicht alle drei der Größen 8, 16 und 32 Bits haben. Aus diesem Grund tendieren Compiler dazu, int = 32 Bits zu machen, so dass Sie char = 8 Bit, kurz = 16 Bit, int = 32 Bit, lang lang = 64 Bit und lang = 32 Bit oder 64 Bit haben können.

0

Wegen size_t war definieren als

typedef unsigned int size_t; 

Sie es mit% zu,% u oder% lu anstelle von% d angezeigt werden sollen.

printf("%zu\n", sizet); 
printf("%u\n", sizet); 
printf("%lu\n", sizet); 
+1

'size_t' ist nicht definiert als' unsigned int'. 'size_t' ist ein vorzeichenloser Integer-Typ mit _least_ 16 Bit Breite. Wenn 'printf ("% zu \ n ", sizet);' korrekt ist, können die anderen undefiniertes Verhalten aufrufen. – chux

Verwandte Themen