Koreksi saya jika saya salah,
int adalah 4 byte, dengan kisaran nilai dari -2,147,483,648 hingga 2,147,483,647 (2 ^ 31)
panjangnya adalah 4 byte, dengan kisaran nilai dari -2,147,483,648 hingga 2,147,483,647 (2 ^ 31)
Apa perbedaan C ++? Bisakah mereka digunakan secara bergantian?
#include <stdint.h>
dan kemudian jenis yang menentukan ukurannya. Misuint32_t
. Pada platform baru, Anda hanya perlu memastikan stdint.h melakukannya dengan benar untuk platform tertentu dan kode Anda berfungsi sebagaimana mestinya.Jawaban:
Ini tergantung pada implementasi.
Misalnya, di bawah Windows mereka sama, tetapi misalnya pada sistem Alpha panjangnya 64 bit sedangkan int adalah 32 bit. Artikel ini membahas aturan untuk kompiler Intel C ++ pada platform variabel. Untuk meringkas:
sumber
Satu-satunya jaminan yang Anda miliki adalah:
Juga lihat: Apakah
long
dijamin minimal 32 bit?sumber
Saat mengompilasi untuk x64, perbedaan antara int dan long berada di antara 0 dan 4 byte, tergantung pada kompiler yang Anda gunakan.
GCC menggunakan model LP64, yang berarti int adalah 32-bit tetapi panjang adalah 64-bit dalam mode 64-bit.
MSVC misalnya menggunakan model LLP64, yang berarti int dan long adalah 32-bit bahkan dalam mode 64-bit.
sumber
Spesifikasi C ++ itu sendiri (versi lama tetapi cukup baik untuk ini) membiarkannya terbuka.
sumber
Seperti yang ditunjukkan Kevin Haines, int memiliki ukuran alami yang disarankan oleh lingkungan eksekusi, yang harus sesuai dengan INT_MIN dan INT_MAX.
Standar C89 menyatakan bahwa
UINT_MAX
setidaknya harus 2 ^ 16-1,USHRT_MAX
2 ^ 16-1 danULONG_MAX
2 ^ 32-1. Itu membuat hitungan bit setidaknya 16 untuk pendek dan int, dan 32 untuk panjang. Untuk char itu menyatakan secara eksplisit bahwa ia harus memiliki setidaknya 8 bit (CHAR_BIT
). C ++ mewarisi aturan tersebut untuk file limit.h, jadi di C ++ kita memiliki persyaratan dasar yang sama untuk nilai tersebut. Namun Anda tidak boleh mendapatkan dari int yang setidaknya 2 byte. Secara teoritis, char, int dan long semuanya bisa 1 byte, dalam hal iniCHAR_BIT
minimal harus 32. Ingatlah bahwa "byte" selalu seukuran char, jadi jika char lebih besar, byte tidak hanya 8 bit saja. lebih.sumber
byte
tipe data ada di C ++. Tidak, bukan? Jika ya, danbyte
kaleng memiliki ukuran selain 8 bit, itu benar-benar bodoh. Mengapa mereka menyebutnya byte kecuali jika benar-benar harus 8 bit?Itu tergantung pada kompiler Anda. Anda dijamin bahwa panjang akan setidaknya sebesar int, tetapi Anda tidak dijamin bahwa itu akan lebih lama lagi.
sumber
Sebagian besar, jumlah byte dan rentang nilai ditentukan oleh arsitektur CPU, bukan oleh C ++. Namun, C ++ menetapkan persyaratan minimum, yang dijelaskan litb dengan benar dan Martin York hanya membuat beberapa kesalahan.
Alasan mengapa Anda tidak dapat menggunakan int dan long secara bergantian adalah karena panjangnya tidak selalu sama. C ditemukan pada PDP-11 di mana satu byte memiliki 8 bit, int adalah dua byte dan dapat ditangani langsung oleh instruksi perangkat keras. Karena pemrogram C sering membutuhkan aritmatika empat-byte, panjang ditemukan dan empat byte, ditangani oleh fungsi perpustakaan. Mesin lain memiliki spesifikasi yang berbeda. Standar C memberlakukan beberapa persyaratan minimum.
sumber
Mengandalkan implementasi vendor compiler untuk ukuran tipe primitif AKAN kembali menghantui Anda jika Anda pernah mengompilasi kode Anda pada arsitektur mesin lain, OS, atau compiler vendor lain.
Sebagian besar vendor compiler menyediakan file header yang mendefinisikan tipe primitif dengan ukuran tipe explict. Jenis primitif ini harus digunakan ketika kode mungkin berpotensi di-porting ke kompiler lain (baca ini sebagai SELALU dalam SETIAP contoh). Misalnya, sebagian besar kompiler UNIX memiliki
int8_t uint8_t int16_t int32_t uint32_t
. Microsoft memilikiINT8 UINT8 INT16 UINT16 INT32 UINT32
. Saya lebih suka Borland / CodeGearint8 uint8 int16 uint16 int32 uint32
. Nama-nama ini juga memberikan sedikit pengingat akan ukuran / range dari nilai yang diinginkan.Selama bertahun-tahun saya telah menggunakan nama tipe primitif eksplisit Borland dan
#include
file header C / C ++ berikut (primitive.h) yang dimaksudkan untuk mendefinisikan tipe primitif eksplisit dengan nama-nama ini untuk kompiler C / C ++ (file header ini mungkin tidak benar-benar mencakup setiap compiler tetapi mencakup beberapa kompiler yang telah saya gunakan pada Windows, UNIX dan Linux, itu juga (belum) mendefinisikan tipe 64bit).sumber
Standar C ++ mengatakannya seperti ini:
3.9.1, §2:
Kesimpulannya: itu tergantung pada arsitektur mana yang sedang Anda kerjakan. Asumsi lainnya salah.
sumber