Mengapa pendek, int, dan lama ditemukan di C?

16

Saya mengalami kesulitan pemahaman, apa yang menjadi tujuan yang tepat dari menciptakan short, intdan longtipe data di C?

Alasan saya bertanya adalah, sepertinya ukurannya tidak dibatasi - ukurannya bisa berapa saja, asalkan shortlebih kecil dari int, misalnya.

Dalam situasi apa, maka, haruskah Anda menggunakan unsigned intatau unsigned long, misalnya, alih-alih size_t, ketika melakukannya tidak menawarkan harapan kompatibilitas biner?

(Jika Anda tidak tahu ukurannya, lalu bagaimana Anda tahu kapan harus memilih yang mana?)

pengguna541686
sumber
2
Lihat<stdint.h>
BlackJack
1
@ BlackJack: Haha ya saya sebenarnya - tapi saya kira pertanyaan saya adalah, mengapa semua jenis itu tidak didefinisikan secara asli? Apakah ini merupakan "tinjau balik adalah 20/20", atau adakah alasan khusus?
user541686
2
C dimaksudkan untuk menjadi portabel dan dekat dengan perangkat keras yang mendasarinya. Ada platform di mana byte tidak 8 bit panjang - tetapi Anda masih bisa menggunakan C. Tidak ada set tipe data tetap yang akan cukup, tidak ada ukuran tetap integere yang bisa menjadi portabel.
SK-logic
@ SK-logic: Tidak sekalipun mereka mengatakan sizeof(short) == 2 * sizeof(char)atau serupa?
user541686
1
Ada platform di mana sizeof(char) == sizeof(short), dan itu masuk akal. Sayangnya, tidak ada cara untuk menentukan tipe angka yang tidak terpisahkan dengan cara itu sehingga mereka akan cocok dengan semua platform yang mungkin dan yang ada.
SK-logic

Jawaban:

12

Itu akan ditentukan oleh arsitektur yang Anda gunakan. Pada chip Zilog z80 (chip tertanam umum) mereka akan menjadi satu ukuran sementara mereka bisa menjadi ukuran yang sama sekali berbeda pada chipset x86. Namun, ukurannya sendiri adalah rasio tetap satu sama lain. Pada dasarnya pendek dan panjang bukan tipe tetapi memenuhi syarat untuk tipe int. Int pendek akan menjadi satu urutan besarnya lebih kecil dari int (reguler) dan int panjang akan menjadi urutan besarnya lebih tinggi. Jadi katakanlah Int Anda dibatasi hingga 4 byte, kualifikasi pendek mengikatnya menjadi 4 byte meskipun 2 byte juga sangat umum dan kualifikasi panjang meningkatkannya secara potensial menjadi 8 byte meskipun bisa kurang dari 4 byte. Perlu diingat bahwa ini tergantung pada panjang kata juga jadi pada sistem 32 bit Anda akan maksimal pada 4 byte per int tetap membuat panjang sama dengan int biasa. Jadi, Pendek ≤ Int ≤ Panjang.

Namun, jika Anda memperpanjangnya lagi, Anda bisa mendorong int ke sel berikutnya memberi Anda 8 byte penyimpanan penuh. Ini adalah ukuran kata untuk mesin 64 bit sehingga mereka tidak perlu khawatir tentang hal-hal seperti itu dan cukup gunakan satu sel untuk int panjang yang memungkinkan mereka untuk menjadi urutan lain di atas int standar sementara int panjang panjang mendapatkan sangat sedikit.

Sejauh mana untuk memilih, itu bermuara pada sesuatu yang programmer Java misalnya tidak perlu khawatir. "Apa arsitekturmu?" Karena itu semua tergantung pada ukuran kata dari memori mesin yang bersangkutan, Anda harus memahami itu terlebih dahulu sebelum Anda memutuskan mana yang akan digunakan. Anda kemudian memilih ukuran wajar terkecil untuk menghemat memori sebanyak mungkin karena memori itu akan dialokasikan apakah Anda menggunakan semua bit di dalamnya atau tidak. Jadi Anda menghemat di mana Anda bisa dan mengambil celana pendek saat Anda bisa dan int ketika Anda tidak bisa dan jika Anda membutuhkan sesuatu yang lebih besar dari int reguler yang Anda berikan; Anda akan memperpanjang sesuai kebutuhan sampai Anda menekan langit-langit kata. Maka Anda perlu menyediakan rutinitas angka besar atau mendapatkannya dari perpustakaan.

C mungkin "perakitan portabel" tetapi Anda masih harus tahu perangkat keras Anda.

Insinyur Dunia
sumber
11
ini tidak sepenuhnya benar, celana pendek tidak harus lebih kecil dari int, mereka tidak boleh lebih besar dari ints
jk.
Saya akan memperbaikinya.
Insinyur Dunia
2
Demikian pula, rindu tidak bisa lebih kecil dari int.
Donal Fellows
1
memang saya percaya ada mesin-mesin di mana pendek, int dan panjang di mana persis sama.
jk.
6

Meskipun hari ini, "byte" berarti "8 bit", itu tidak selalu benar. Mesin telah menggunakan potongan beralamat dari 4 bit, 8 bit, 12 bit, 16 bit, 32 bit, dan 36 bit (dan mungkin beberapa ukuran lain juga). Salah satu tujuan desain C adalah agar dapat digunakan pada mesin dengan ukuran dan konfigurasi memori yang berbeda.

Saya pikir niat desain awalnya bahwa setiap jenis selain intmenjadi hal terkecil yang dapat menangani jumlah berbagai ukuran, dan itu intmenjadi ukuran "tujuan umum" paling praktis yang dapat menangani +/- 32767. Saya tidak berpikir ada keinginan atau niat untuk membuat bahasa yang masih akan digunakan ketika komputer menjadi sangat kuat sehingga operasi pada angka 64-bit sama dengan operasi pada yang lebih kecil.

Masalah terbesar dengan semantik tipe-integer C adalah bahwa dalam beberapa konteks mereka mewakili bilangan kardinal atau bilangan bulat matematika, sedangkan dalam konteks lain mereka digunakan untuk mewakili anggota cincin aljabar abstrak pembungkus bilangan bulat kongruen mod 2 ^ n [jadi misalnya mengurangi nilai maksimum yang dapat diwakili dari 0 didefinisikan untuk menghasilkan 1], tetapi perilaku lebih ditentukan berdasarkan apa yang tampaknya dilakukan oleh kompiler pada hari-hari ketika ukuran kata komputer sekitar 16 bit (dan ukuran kata 36-bit akan sangat besar ), daripada berdasarkan apa yang masuk akal pada mesin 64-bit. Akibatnya, hasil pengurangan nilai 32-bit unsigned dari nilai 32-bit unsigned yang lebih kecil dapat berupa nilai unsigned 32-bit yang besar, atau angka 64-bit negatif.

supercat
sumber
4

/programming/589575/size-of-int-long-etc

Jadi dalam arsitektur yang paling umum digunakan, char adalah 1 byte, pendek dan int minimal 2 byte, dan panjang setidaknya 4 byte.

Dan itu dimaksudkan bahwa 'int' harus menjadi representasi paling alami / normal / efisien untuk CPU saat ini.

Jadi aturan umumnya adalah menggunakan 'int' kecuali nilai Anda melebihi +/- 32K, membuat Anda (pada CPU yang lebih tua) menggunakan 'panjang'. ... atau kecuali Anda membuat array besar dengan nilai kecil (<32K), dan memori adalah masalah - jadi Anda akan menggunakan 'pendek' untuk menghemat memori (atau mungkin 'char' atau 'byte').

Jeff Grigg
sumber
2
Tetapi dengan 64-bit, bukankah itu intpilihan yang bagus, bukan? Saya hampir selalu berakhir dengan menggunakan size_t(atau bahkan ptrdiff_t!) Untuk menghindari masalah dengan kode porting.
user541686
@Merhdad - int digunakan untuk pilihan terbaik itu adalah untuk menjadi 'unit standar' dari HW, dan biasanya ukuran pointer. Saat ini menggunakan size_t untuk keamanan.
Martin Beckett
1

C dirancang untuk secara aktif menangani memori pada level yang berbeda. Ada kasus di mana perbedaan antara pendek, int, dan panjang, dan antara float dan double, penting karena kendala memori, arsitektur, dll. Meskipun itu kurang penting sekarang, masih ada lingkungan di mana ia melakukannya (misalnya, tertanam, dan dalam kasus di mana data sangat besar), dan transisi dari arsitektur terutama 32-bit ke 64 bit membuatnya agak menjadi masalah lagi. (Dalam sepuluh atau dua puluh tahun ketika kita beralih ke arsitektur 128 bit dan C / C ++ masih populer, itu akan kembali menjadi masalah). Anda benar meskipun kompatibilitas biner itu menderita, itulah sebabnya Anda tidak ingin menggunakan ukuran tipe variabel ini di tempat yang penting.

Anda bertanya bagaimana Anda akan tahu mana yang harus digunakan jika Anda tidak tahu ukurannya, tetapi Anda tahu ukurannya pada kombinasi arsitektur / kompiler yang diberikan, dan jika Anda perlu mengoptimalkan memori pada tingkat itu, Anda sebaiknya mengetahuinya. Anda tidak dapat mengoptimalkannya hanya di seluruh platform karena Anda tidak dapat mengetahui ukurannya, sehingga Anda tidak ingin menggunakan fitur-fitur itu untuk tujuan itu. Tetapi banyak hal yang ditulis dalam C adalah platform-spesifik, yang, meskipun mode untuk "lintas platform", memang memungkinkan untuk beberapa optimasi yang menguntungkan.

Kylben
sumber