Apakah variabel Integer dalam C menempati 2 byte atau 4 byte?
Itu tergantung pada platform yang Anda gunakan, serta bagaimana kompiler Anda dikonfigurasi. Satu-satunya jawaban yang berwenang adalah menggunakan sizeof
operator untuk melihat seberapa besar bilangan bulat dalam situasi spesifik Anda.
Apa faktor yang menjadi sandarannya?
Rentang mungkin lebih baik dipertimbangkan, daripada ukuran . Keduanya akan bervariasi dalam praktiknya, meskipun jauh lebih mudah untuk memilih tipe variabel berdasarkan rentang daripada ukuran seperti yang akan kita lihat. Penting juga untuk dicatat bahwa standar mendorong kita untuk mempertimbangkan memilih tipe integer kita berdasarkan rentang daripada ukuran , tetapi untuk sekarang mari kita abaikan praktik standar , dan biarkan rasa ingin tahu kita mengeksplorasi sizeof
, byte dan CHAR_BIT
, dan representasi integer ... mari kita menggali lebih dalam lubang kelinci dan lihat sendiri ...
sizeof
, byte dan CHAR_BIT
Pernyataan berikut, diambil dari standar C (terkait dengan di atas), menjelaskan hal ini dengan kata-kata yang menurut saya tidak dapat diperbaiki.
Itu sizeof
Operator menghasilkan ukuran (dalam bytes) dari operan, yang mungkin merupakan ekspresi atau nama kurung dari tipe. Ukurannya ditentukan dari jenis operan.
Dengan asumsi pemahaman yang jelas akan membawa kita ke diskusi tentang byte . Biasanya diasumsikan bahwa byte adalah delapan bit, padahal sebenarnya CHAR_BIT
memberitahu Anda berapa banyak bit dalam satu byte . Itu hanya salah satu dari nuansa yang tidak dipertimbangkan ketika berbicara tentang dua (atau empat) byte integer yang umum .
Mari kita selesaikan sejauh ini:
sizeof
=> ukuran dalam byte, dan
CHAR_BIT
=> jumlah bit dalam byte
Dengan demikian, Tergantung pada sistem Anda, sizeof (unsigned int)
bisa saja nilai lebih besar dari nol (tidak hanya 2 atau 4), seolah-olah CHAR_BIT
adalah 16, maka satu (enam belas-bit) byte memiliki bit cukup di dalamnya untuk mewakili enam belas bit integer dijelaskan oleh standar (dikutip di bawah). Itu belum tentu informasi yang berguna, bukan? Mari kita selami lebih dalam ...
Representasi integer
Standar C menentukan presisi / kisaran minimum untuk semua jenis integer standar (dan CHAR_BIT
, juga, fwiw) di sini . Dari ini, kita dapat memperoleh minimum untuk berapa banyak bit yang diperlukan untuk menyimpan nilai , tetapi kita mungkin juga hanya memilih variabel berdasarkan rentang . Meskipun demikian, sebagian besar detail yang diperlukan untuk jawaban ini ada di sini. Misalnya, berikut ini yang unsigned int
membutuhkan standar (setidaknya) enam belas bit penyimpanan:
UINT_MAX 65535 // 2¹⁶ - 1
Dengan demikian kita dapat melihat bahwa unsigned int
memerlukan ( setidaknya ) 16 bit , yang mana Anda mendapatkan dua byte (dengan asumsi CHAR_BIT
8 byte ) ... dan kemudian ketika batas itu meningkat menjadi 2³² - 1
, orang-orang yang menyatakan 4 byte. Ini menjelaskan fenomena yang telah Anda amati:
Sebagian besar buku teks mengatakan variabel integer menempati 2 byte. Tetapi ketika saya menjalankan program mencetak alamat berturut-turut dari array bilangan bulat itu menunjukkan perbedaan 4.
Anda menggunakan buku teks dan kompiler kuno yang mengajarkan Anda non-portable C; penulis yang menulis buku teks Anda mungkin tidak menyadarinya CHAR_BIT
. Anda harus memutakhirkan buku teks (dan kompiler) Anda, dan berusaha untuk mengingat bahwa TI adalah bidang yang terus berkembang sehingga Anda harus tetap terdepan untuk bersaing ... Cukup tentang itu, meskipun; mari kita lihat apa rahasia non-portable lainnya yang disimpan oleh integer bytes ...
Bit nilai adalah apa yang keliru dipahami oleh kesalahpahaman umum. Contoh di atas menggunakan unsigned
tipe integer yang biasanya hanya berisi bit nilai, sehingga mudah untuk melewatkan iblis secara detail.
Tanda bit ... Pada contoh di atas saya kutip UINT_MAX
sebagai batas atas unsigned int
karena ini adalah contoh sepele untuk mengekstrak nilai 16
dari komentar. Untuk tipe yang ditandatangani, untuk membedakan antara nilai positif dan negatif (itu tandanya), kita juga perlu memasukkan bit tanda.
INT_MIN -32768 // -(2¹⁵)
INT_MAX +32767 // 2¹⁵ - 1
Padding bits ... Meskipun tidak umum untuk menjumpai komputer yang memiliki bit padding dalam bilangan bulat, standar C memungkinkan hal itu terjadi; beberapa mesin (yaitu yang ini ) mengimplementasikan tipe integer yang lebih besar dengan menggabungkan dua nilai integer yang lebih kecil (ditandatangani) ... dan ketika Anda menggabungkan integer yang ditandatangani, Anda mendapatkan bit tanda yang terbuang. Bit yang terbuang tersebut dianggap sebagai padding dalam C. Contoh lain dari bit padding mungkin termasuk bit paritas dan bit trap .
Seperti yang Anda lihat, standar tampaknya mendorong rentang pertimbangan seperti INT_MIN
.. INT_MAX
dan nilai minimum / maksimum lainnya dari standar saat memilih jenis bilangan bulat, dan mencegah bergantung pada ukuran karena ada faktor halus lainnya yang mungkin dilupakan seperti CHAR_BIT
dan bit bantalan yang mungkin mempengaruhi nilai sizeof (int)
(miskonsepsi umum bilangan bulat dua-byte dan empat-byte mengabaikan detail-detail ini).