Perbedaan antara int32, int, int32_t, int8 dan int8_t

104

Saya menemukan tipe data int32_tdalam program C baru-baru ini. Saya tahu bahwa itu menyimpan 32 bit, tetapi tidak intdan int32melakukan hal yang sama?

Juga, saya ingin menggunakan chardalam sebuah program. Bisakah saya menggunakan int8_tsebagai gantinya? Apa bedanya?

Untuk meringkas: apa perbedaan antara int32, int, int32_t, int8 dan int8_t di C?

linuxfreak
sumber

Jawaban:

122

Antara int32dan int32_t, (dan juga antara int8dan int8_t) perbedaannya cukup sederhana: standar C mendefinisikan int8_tdan int32_t, tetapi tidak mendefinisikan apa pun yang bernama int8atau int32- yang terakhir (jika ada sama sekali) mungkin berasal dari beberapa header atau pustaka lain (kemungkinan besar mendahului penambahan int8_tdan int32_tdi C99).

Biasa intsedikit berbeda dari yang lain. Dimana int8_tdan int32_tmasing-masing mempunyai ukuran tertentu, intbisa berapapun size> = 16 bits. Pada waktu yang berbeda, 16 bit dan 32 bit sudah cukup umum (dan untuk implementasi 64-bit, mungkin 64 bit).

Di sisi lain, intdijamin akan hadir dalam setiap implementasi C, di mana int8_tdan int32_ttidak. Mungkin terbuka untuk mempertanyakan apakah ini penting bagi Anda. Jika Anda menggunakan C pada sistem tertanam kecil dan / atau kompiler lama, mungkin ada masalah. Jika Anda menggunakannya terutama dengan kompiler modern pada mesin desktop / server, mungkin tidak.

Ups - melewatkan bagian tentang char. Anda akan menggunakan int8_tsebagai ganti char jika (dan hanya jika) Anda ingin tipe integer dijamin berukuran tepat 8 bit. Jika Anda ingin menyimpan karakter, Anda mungkin ingin menggunakannya char. Ukurannya dapat bervariasi (dalam hal jumlah bit) tetapi dijamin persis satu byte. Namun ada satu keanehan: tidak ada jaminan apakah sebuah dataran charditandatangani atau tidak (dan banyak kompiler dapat menjadikannya salah satu, tergantung pada bendera waktu kompilasi). Jika Anda perlu memastikannya ditandatangani atau tidak, Anda perlu menentukannya secara eksplisit.

Jerry Coffin
sumber
1
@linuxfreak: Tidak yakin bool_t- belum pernah mendengar yang itu sebelumnya. Standar C didefinisikan _Boolsebagai tipe built-in. boolditentukan hanya jika Anda #include <stdbool.h>(sebagai makro yang diperluas ke _Bool).
Jerry Coffin
5
Anda berkata "untuk implementasi 64-bit, (int) mungkin harus 64 bit". Dalam praktiknya, int adalah 32-bit pada semua platform 64-bit umum termasuk Windows, Mac OS X, Linux, dan berbagai varian UNIX. Satu pengecualian adalah Cray / UNICOS tetapi sekarang sudah ketinggalan zaman.
Sam Watkins
6
@ SamWatkins: Ya, itulah mengapa saya dengan hati-hati mengatakan "harus", bukan "adalah". Standar mengatakan itu "ukuran alami yang disarankan oleh arsitektur", yang (IMO) berarti pada prosesor 64-bit, itu harus 64 bit (meskipun, baik atau buruk, Anda benar bahwa biasanya tidak ' t). Dari sudut pandang yang lebih praktis, itu adalah sangat berguna untuk memiliki tipe 32-bit di antara jenis di C89, dan jika int adalah 64 bit, panjang harus setidaknya 64 bit juga, jadi ada akan sering ada 32-bit Tipe.
Jerry Coffin
2
@barlop: Ya. (Baik C dan C ++ mengamanatkan kisaran minimum 255 nilai untuk char, sehingga membutuhkan setidaknya 8 bit, tetapi bisa lebih).
Jerry Coffin
2
Saya selalu mendapat kesan bahwa satu byte persis 8 bit, tidak di mana pun dari 8 bit ke atas
ErlVolton
18

Tipe data _t adalah tipe typedef di header stdint.h, sedangkan int adalah tipe data fundamental bawaan. Ini membuat _t tersedia hanya jika stdint.h ada. int di sisi lain dijamin ada.

Superman
sumber
1
Mengapa seseorang menggunakan yang _t?
Deven
@Deven Untuk menghindari kasus di mana kode Anda berfungsi di suatu tempat tetapi tidak di tempat lain.
Franklin Yu
2

Ingatlah selalu bahwa 'size' adalah variabel jika tidak ditentukan secara eksplisit, jadi jika Anda mendeklarasikan

 int i = 10;

Pada beberapa sistem, ini dapat menghasilkan integer 16-bit oleh kompiler dan pada beberapa lainnya dapat menghasilkan integer 32-bit (atau integer 64-bit pada sistem yang lebih baru).

Di lingkungan yang disematkan, hal ini mungkin berakhir dengan hasil yang aneh (terutama saat menangani I / O yang dipetakan memori atau mungkin mempertimbangkan situasi array sederhana), jadi sangat disarankan untuk menentukan variabel ukuran tetap. Dalam sistem lama, Anda mungkin akan menemukannya

 typedef short INT16;
 typedef int INT32;
 typedef long INT64; 

Mulai dari C99, desainer menambahkan file header stdint.h yang pada dasarnya memanfaatkan typedefs serupa.

Pada sistem berbasis windows, Anda mungkin melihat entri di file header stdin.h sebagai

 typedef signed char       int8_t;
 typedef signed short      int16_t;
 typedef signed int        int32_t;
 typedef unsigned char     uint8_t;

Ada lebih dari itu seperti integer lebar minimum atau tipe integer lebar yang tepat, saya pikir itu bukan hal yang buruk untuk menjelajahi stdint.h untuk pemahaman yang lebih baik.

Naumann
sumber
1
Kode Anda salah ketik:, typedef short INT16;bukan typedefs short INT16.
Galaxy