Pertanyaan Ukuran int dan ukuran penunjuk int pada mesin 64 bit


Saya hanya ingin tahu bagaimana saya bisa tahu apakah laptop saya 64 atau 32 bit. (Ini adalah 64).

Jadi, saya berpikir untuk mencetak yang berikut:

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

dan hasilnya adalah 4, yang terlihat aneh (karena ini adalah mesin 64 bit)

Tapi, ketika saya mencetak ini:

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

hasilnya 8, yang lebih masuk akal.

Pertanyaannya adalah:

Karena saya menggunakan mesin 64 bit, bukankah tipe primitif seperti int harus menggunakan 8 byte

(64 bit) dan dengan ukuran int harus 8? Mengapa tidak demikian?

Dan mengapa ukuran int * adalah 8?

Sedikit bingung di sini,

jadi terima kasih sebelumnya.


20
2017-12-21 16:53


asal


Jawaban:


Tidak, itu sizeof(int) implementasi didefinisikan, dan biasanya 4 byte.

Di sisi lain, untuk mengatasi lebih dari 4GB memori (yang dapat dilakukan sistem 32bit), Anda perlu pointer Anda menjadi 8 byte lebar. int* hanya menyimpan alamat ke "suatu tempat di memori", dan Anda tidak dapat mengatasi lebih dari 4GB memori hanya dengan 32 bit.


21
2017-12-21 16:54



Ukuran pointer harus 8 byte pada kompiler 64-bit C / C ++, tetapi hal yang sama tidak berlaku untuk ukuran int.

Itu wiki memiliki penjelasan yang bagus tentang hal itu:

Di banyak lingkungan pemrograman untuk bahasa C dan C diturunkan   Mesin 64-bit, "int" variabel masih lebar 32 bit, tapi panjang   bilangan bulat dan pointer berukuran 64 bit. Ini digambarkan sebagai memiliki   model data LP64. Alternatif lain adalah model data ILP64 di   dimana ketiga tipe data memiliki lebar 64 bit, dan bahkan SILP64 di mana   Bilangan bulat "pendek" juga lebar 64 bit. [rujukan?] Namun, dalam   kebanyakan kasus modifikasi yang diperlukan relatif kecil dan   mudah, dan banyak program yang ditulis dengan baik bisa begitu saja   dikompilasi ulang untuk lingkungan baru tanpa perubahan. Lain   alternatifnya adalah model LLP64, yang memelihara kompatibilitas dengan   Kode 32-bit dengan meninggalkan int dan panjang sebagai 32-bit. "LL" mengacu pada   "lama integer panjang" jenis, yang setidaknya 64 bit pada semua platform,   termasuk lingkungan 32-bit.


15
2017-12-21 16:56



Itu sizeof(int), sizeof(int*), dan "ukuran mesin", meskipun sering berkorelasi satu sama lain, masing-masing dapat secara mandiri lebih kecil, sama atau lebih besar dari yang lain. Tentang satu-satunya persyaratan C adalah bahwa mereka setidaknya 16 bit (atau lebih) - selain itu, ia bergantung pada compiler untuk sizeof(int), sizeof(int*).

(Meskipun mungkin pointer harus setidaknya ukuran int. Hmmm)


3
2017-12-21 17:50



Programmer ingin memiliki tipe bilangan bulat 1, 2, 4 dan 8 byte atau 8, 16, 32 dan 64 bit. Hanya ada dua tipe integer yang bisa lebih kecil dari int: char dan pendek. Jika int adalah 64 bit, maka Anda tidak bisa memiliki ketiga ukuran 8, 16 dan 32 bit. Itu sebabnya kompiler cenderung membuat int = 32 bit, sehingga Anda dapat memiliki char = 8 bit, short = 16 bit, int = 32 bit, panjang long = 64 bit dan long = 32 bit atau 64 bit.


2
2018-03-29 00:42



Karena size_t didefinisikan sebagai

typedef unsigned int size_t;

Anda harus menampilkannya dengan% zu,% u atau% lu bukannya% d.

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

0
2018-01-08 07:39