wake-up-neo.com

Größe von int und Größe von int Zeiger auf einer 64-Bit-Maschine

Ich habe mich nur gefragt, woher ich wissen kann, ob mein Laptop eine 64- oder 32-Bit-Maschine ist. (Es ist ein 64).

Deshalb habe ich mir überlegt, Folgendes zu drucken:

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

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

Aber als ich das druckte:

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

das Ergebnis war 8, was sinnvoller war.

Die Frage ist:

Da ich eine 64-Bit-Maschine verwende, sollte ein primitiver Typ wie int nicht 8 Bytes verwenden

(64 bit) und von dieser sizeof int sollte 8 sein? Warum ist es nicht so?

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

Ein bisschen verwirrt hier,

also vielen Dank im Voraus.

26
Itzik984

Nein, die sizeof(int) ist implementierungsdefiniert und besteht normalerweise aus 4 Bytes.

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

24
ScarletAmaranth

Die Größe eines Zeigers sollte bei jedem 64-Bit-C/C++ - Compiler 8 Byte betragen, dies gilt jedoch nicht für die Größe von int.

Das wiki hat eine gute Erklärung dafür:

In vielen Programmierumgebungen für C- und C-abgeleitete Sprachen auf 64-Bit-Computern sind "int" -Variablen immer noch 32 Bit breit, aber lange Ganzzahlen und Zeiger sind 64 Bit breit. Diese haben ein LP64-Datenmodell. Eine weitere Alternative ist das ILP64-Datenmodell, bei dem alle drei Datentypen 64 Bit breit sind, und sogar SILP64, bei dem "kurze" Ganzzahlen ebenfalls 64 Bit breit sind. und viele gut geschriebene Programme können einfach ohne Änderungen für die neue Umgebung neu kompiliert werden. Eine weitere Alternative ist das LLP64-Modell, das die Kompatibilität mit 32-Bit-Code aufrechterhält, indem sowohl int als auch long auf 32-Bit belassen werden. "LL" bezieht sich auf den Typ "Long Long Integer", der auf allen Plattformen, einschließlich 32-Bit-Umgebungen, mindestens 64 Bit beträgt.

16
Rahul Tripathi

Die sizeof(int), sizeof(int*) und die "Maschinengröße" können unabhängig voneinander kleiner, gleich oder größer sein, obwohl sie oft miteinander korrelieren. Die einzige C-Anforderung besteht darin, dass sie mindestens 16 Bit (oder so) umfassen. Davon abgesehen ist sie vom Compiler abhängig für die sizeof(int), sizeof(int*).

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

3
chux

Programmierer bevorzugen Integer-Typen mit 1, 2, 4 und 8 Bytes oder 8, 16, 32 und 64 Bits. Es gibt nur zwei Integer-Typen, die kleiner als int sein können: char und short. Wenn int 64 Bit war, konnten Sie nicht alle drei der Größen 8, 16 und 32 Bit haben. Das ist der Grund, warum Compiler dazu neigen, int = 32 Bit zu machen. Sie können also char = 8 Bit, short = 16 Bit, int = 32 Bit, long long = 64 Bit und long = 32 Bit oder 64 Bit verwenden.

2
gnasher729

Wegen size_t wurde definiert als

typedef unsigned int size_t;

Sie sollten es mit% zu,% u oder% lu anstelle von% d anzeigen.

printf("%zu\n", sizet);
printf("%u\n", sizet);
printf("%lu\n", sizet);
0
SuperJOE