Apakah variabel Integer dalam C menempati 2 byte atau 4 byte? Apa faktor yang menjadi sandarannya?
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.
int
hanyalah salah satu dari beberapa tipe integer . Anda bertanya tentang ukuran "integer"; Anda mungkin bermaksud bertanya tentang ukuranint
.int
adalah 2 byte (a) mungkin merujuk pada sistem lama, dan (b) gagal menjelaskan bahwa ukurannya akan bervariasi dari satu sistem ke sistem lainnya. Buku terbaik tentang C adalah "Bahasa Pemrograman C" oleh Kernighan dan Ritchie, meskipun mengasumsikan beberapa pengalaman pemrograman. Lihat juga mempertanyakan 18,10 dari comp.lang.c FAQ .#define int int64_t
pada platform 64-bit, begitu juga keduanya. Gunakan sajasizeof
. ;-)Jawaban:
Saya tahu itu setara dengan
sizeof(int)
. Ukuran suatuint
kompiler benar-benar tergantung. Kembali pada hari itu, ketika prosesor 16 bit,int
adalah 2 byte. Saat ini, ini paling sering 4 byte pada sistem 32-bit dan 64-bit.Tetap saja, menggunakan
sizeof(int)
adalah cara terbaik untuk mendapatkan ukuran bilangan bulat untuk sistem tertentu yang dijalankan oleh program.EDIT: Memperbaiki pernyataan salah yang
int
8 byte pada kebanyakan sistem 64-bit. Misalnya, 4 byte pada GCC 64-bit.sumber
sizeof(int)
dapat berupa nilai apa pun dari1
. Byte tidak harus 8 bit dan beberapa mesin tidak memiliki unit addressable 8 bit (yang pada dasarnya adalah definisi byte dalam standar). Jawabannya tidak benar tanpa informasi lebih lanjut.Ini adalah salah satu poin dalam C yang dapat membingungkan pada awalnya, tetapi standar C hanya menentukan rentang minimum untuk tipe integer yang dijamin akan didukung.
int
dijamin dapat menahan -32767 hingga 32767, yang membutuhkan 16 bit. Dalam hal iniint
,, adalah 2 byte. Namun, implementasi bebas untuk melampaui batas minimum tersebut, karena Anda akan melihat bahwa banyak kompiler modern membuatint
32-bit (yang juga berarti 4 byte dengan cukup di mana-mana).Alasan buku Anda mengatakan 2 byte kemungkinan besar karena sudah tua. Pada suatu waktu, ini adalah norma. Secara umum, Anda harus selalu menggunakan
sizeof
operator jika Anda perlu mengetahui berapa byte pada platform yang Anda gunakan.Untuk mengatasinya, C99 menambahkan jenis baru di mana Anda dapat secara eksplisit meminta bilangan bulat berukuran tertentu, misalnya
int16_t
atauint32_t
. Sebelum itu, tidak ada cara universal untuk mendapatkan bilangan bulat dengan lebar tertentu (meskipun sebagian besar platform menyediakan tipe yang serupa pada basis per-platform).sumber
int
. C tidak membuat asumsi itu. Sistem komplemen dan sign-magnitude 1 tidak dapat mewakili-32768
dalam 16 bit; sebaliknya, mereka memiliki dua representasi untuk nol (positif dan negatif). Itu sebabnya kisaran minimum untukint
adalah[-32767..32767]
.Tidak ada jawaban spesifik. Itu tergantung pada platform. Ini adalah implementasi yang ditentukan. Itu bisa 2, 4 atau yang lainnya.
Gagasan di belakang
int
adalah bahwa itu seharusnya cocok dengan ukuran "kata" alami pada platform yang diberikan: 16 bit pada platform 16-bit, 32 bit pada platform 32-bit, 64 bit pada platform 64-bit, Anda mendapatkan idenya. Namun, untuk tujuan kompatibilitas ke belakang, beberapa kompiler lebih suka tetap menggunakan 32-bitint
bahkan pada platform 64-bit.Waktu 2-byte
int
sudah lama hilang (platform 16-bit?) Kecuali Anda menggunakan platform tertanam dengan ukuran kata 16-bit. Buku teks Anda mungkin sudah sangat tua.sumber
The idea behind int was that it was supposed to match the natural "word" size on the given platform
- Ini yang saya cari. Adakah yang tahu alasannya? Di dunia bebas, int bisa menempati sejumlah byte berturut-turut dalam memori bukan? 8, 16 terserahJawaban untuk pertanyaan ini tergantung pada platform yang Anda gunakan.
Namun terlepas dari platform, Anda dapat dengan andal berasumsi tipe-tipe berikut:
sumber
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.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 danCHAR_BIT
, dan representasi integer ... mari kita menggali lebih dalam lubang kelinci dan lihat sendiri ...sizeof
, byte danCHAR_BIT
Pernyataan berikut, diambil dari standar C (terkait dengan di atas), menjelaskan hal ini dengan kata-kata yang menurut saya tidak dapat diperbaiki.
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, danCHAR_BIT
=> jumlah bit dalam byteDengan demikian, Tergantung pada sistem Anda,
sizeof (unsigned int)
bisa saja nilai lebih besar dari nol (tidak hanya 2 atau 4), seolah-olahCHAR_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 yangunsigned int
membutuhkan standar (setidaknya) enam belas bit penyimpanan:Dengan demikian kita dapat melihat bahwa
unsigned int
memerlukan ( setidaknya ) 16 bit , yang mana Anda mendapatkan dua byte (dengan asumsiCHAR_BIT
8 byte ) ... dan kemudian ketika batas itu meningkat menjadi2³² - 1
, orang-orang yang menyatakan 4 byte. Ini menjelaskan fenomena yang telah Anda amati: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 atasunsigned int
karena ini adalah contoh sepele untuk mengekstrak nilai16
dari komentar. Untuk tipe yang ditandatangani, untuk membedakan antara nilai positif dan negatif (itu tandanya), kita juga perlu memasukkan bit tanda.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 sepertiCHAR_BIT
dan bit bantalan yang mungkin mempengaruhi nilaisizeof (int)
(miskonsepsi umum bilangan bulat dua-byte dan empat-byte mengabaikan detail-detail ini).sumber
C99 N1256 draft standar
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
Ukuran
int
dan semua tipe integer lainnya adalah implementasi yang ditentukan, C99 hanya menentukan:5.2.4.2.1 "Ukuran tipe integer
<limits.h>
" memberikan ukuran minimum:6.2.5 "Jenis" lalu mengatakan:
dan 6.3.1.1 "Boolean, karakter, dan bilangan bulat" menentukan peringkat konversi relatif:
sumber
Satu-satunya jaminan adalah yang
char
harus memiliki lebar minimal 8 bit,short
danint
harus memiliki lebar setidaknya 16 bit, danlong
harus memiliki lebar setidaknya 32 bit, dan itusizeof (char)
<=sizeof (short)
<=sizeof (int)
<=sizeof (long)
(sama juga berlaku untuk versi yang tidak ditandatangani dari tipe-tipe tersebut. ).int
mungkin di mana saja dari 16 hingga 64 bit lebar tergantung pada platform.sumber
Jawabannya adalah "ya" / "tidak" / "mungkin" / "mungkin tidak".
Bahasa pemrograman C menentukan yang berikut: unit terkecil yang dapat dialamatkan, dikenal oleh
char
dan juga disebut "byte" , adalahCHAR_BIT
bit lebar, di manaCHAR_BIT
setidaknya 8.Jadi, satu byte dalam C belum tentu merupakan oktet , yaitu 8 bit. Di masa lalu salah satu platform pertama untuk menjalankan kode C (dan Unix) memiliki 4-byte
int
- tetapi secara totalint
memiliki 36 bit, karenaCHAR_BIT
9!int
seharusnya merupakan ukuran integer alami untuk platform yang memiliki jangkauan setidaknya-32767 ... 32767
. Anda bisa mendapatkan ukuranint
dalam byte platform dengansizeof(int)
; ketika Anda mengalikan nilai ini denganCHAR_BIT
Anda akan tahu seberapa lebar itu dalam bit.Sementara mesin 36-bit sebagian besar mati, masih ada platform dengan byte non-8-bit. Baru kemarin ada pertanyaan tentang MCU Texas Instruments dengan byte 16-bit , yang memiliki compiler C99, C11-compliant.
Pada TMS320C28x tampaknya
char
,short
danint
yang semua 16 bit yang luas, dan karenanya satu byte.long int
adalah 2 byte danlong long int
4 byte. Keindahan C adalah seseorang masih dapat menulis program yang efisien untuk platform seperti ini, dan bahkan melakukannya dengan cara yang portabel!sumber
Sebagian besar tergantung pada platform yang Anda gunakan. Itu tergantung dari kompiler ke kompiler. Saat ini di sebagian besar kompiler int adalah dari 4 byte . Jika Anda ingin memeriksa apa yang digunakan kompiler, Anda dapat menggunakannya
sizeof(int)
.Satu-satunya hal yang menjanjikan kompiler c adalah ukuran pendek harus sama atau kurang dari int dan ukuran panjang harus sama atau lebih dari int. Jadi jika ukuran int adalah 4, maka ukuran pendek mungkin 2 atau 4 tetapi tidak lebih besar dari itu. Hal yang sama berlaku untuk lama dan int. Ia juga mengatakan bahwa ukuran pendek dan panjang tidak bisa sama.
sumber
%d
untuksize_t
parameter adalah UB.Ini tergantung pada implementasi, tetapi biasanya pada x86 dan arsitektur populer lainnya seperti ARM
int
mengambil 4 byte. Anda selalu dapat memeriksa pada waktu kompilasi menggunakansizeof(int)
atau jenis apa pun yang ingin Anda periksa.Jika Anda ingin memastikan Anda menggunakan jenis ukuran tertentu, gunakan jenis dalam
<stdint.h>
sumber
Ini mengembalikan 4, tapi itu mungkin tergantung mesin.
sumber
C memungkinkan "byte" menjadi sesuatu selain 8 bit per "byte".
Nilai dari sesuatu di atas 8 semakin tidak umum. Untuk portabilitas maksimum, gunakan
CHAR_BIT
daripada 8. Ukuran dariint
dalam bit di C adalahsizeof(int) * CHAR_BIT
.The
int
ukuran bit umumnya 32 atau 16 bit. C rentang minimum yang ditentukan :The rentang minimum untuk
int
pasukan ukuran bit menjadi setidaknya 16 - bahkan jika prosesor adalah "8-bit". Ukuran seperti 64 bit terlihat pada prosesor khusus. Nilai-nilai lain seperti 18, 24, 36, dll. Telah terjadi pada platform bersejarah atau setidaknya secara teori dimungkinkan. Pengkodean modern jarang khawatir tentang non-power-of-2int
ukuran bit .Prosesor dan arsitektur komputer menggerakkan
int
pemilihan ukuran bit.Namun bahkan dengan prosesor 64-bit,
int
ukuran kompiler mungkin 32-bit untuk alasan kompatibilitas karena basis kode besar bergantung padaint
32-bit (atau 32/16).sumber
Ini adalah sumber yang bagus untuk menjawab pertanyaan ini.
Tetapi pertanyaan ini adalah semacam jawaban yang selalu benar, "Ya. Keduanya."
Tergantung pada arsitektur Anda. Jika Anda akan bekerja pada mesin 16-bit atau kurang, itu tidak bisa 4 byte (= 32 bit). Jika Anda bekerja pada mesin 32-bit atau lebih baik, panjangnya 32-bit.
Untuk mencari tahu, siapkan program Anda untuk menampilkan sesuatu yang dapat dibaca dan gunakan fungsi "sizeof". Itu mengembalikan ukuran dalam byte dari tipe data yang Anda nyatakan. Tapi hati-hati menggunakan ini dengan array.
Jika Anda mendeklarasikannya
int t[12];
akan mengembalikan 12 * 4 byte. Untuk mendapatkan panjang array ini, cukup gunakansizeof(t)/sizeof(t[0])
. Jika Anda akan membangun sebuah fungsi, yang seharusnya menghitung ukuran array pengiriman, ingatlah bahwa jikaJadi ini bahkan tidak akan mengembalikan sesuatu yang berbeda. Jika Anda mendefinisikan array dan mencoba mendapatkan panjangnya setelah itu, gunakan sizeof. Jika Anda mengirim array ke suatu fungsi, ingat nilai kirim hanyalah sebuah pointer pada elemen pertama. Tetapi dalam kasus satu, Anda selalu tahu, berapa ukuran array Anda. Kasus dua dapat dipecahkan dengan mendefinisikan dua fungsi dan melewatkan beberapa kinerja. Tentukan fungsi (array t) dan tentukan function2 (array t, int size_of_t). Call "function (t)" mengukur panjang dengan beberapa copy-work dan mengirimkan hasilnya ke function2, di mana Anda dapat melakukan apa pun yang Anda inginkan pada ukuran array variabel.
sumber
char
Selalusigned
)