Menu

Tipe Data C++: int, double, char, bool, dan Lainnya

Tur praktis tipe data dasar C++, yaitu bilangan bulat, floating-point, char, dan bool, plus ukurannya, signed vs unsigned, literal dan sufiks, overflow, dan cara memilih tipe yang tepat.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Kenapa Tipe Penting di C++

Saat kamu mendeklarasikan nilai dengan tipe eksplisit seperti int age = 30;, tipe itu bukan sekadar label. Ia memberi tahu compiler berapa byte yang perlu disediakan, cara menafsirkan byte-byte itu, dan operasi apa saja yang sah. Salah memilih tipe bisa membuatmu diam-diam kehilangan presisi, mengalami overflow, atau memicu undefined behavior.

C++ mengelompokkan tipe bawaannya ke dalam beberapa keluarga: bilangan bulat, bilangan floating-point, tipe karakter, dan boolean. Mari kita lihat masing-masing, lalu aturan-aturan yang sering menjebak.

Tipe-Tipe Dasar

Berikut satu contoh dari setiap tipe inti dalam satu program. Perhatikan sufiks literalnya (L, f, u) dan tanda kutip tunggal pada char:

Secara default bool dicetak sebagai 1 atau 0, bukan true/false. char memakai tanda kutip tunggal: 'A' adalah satu karakter, sedangkan "A" (tanda kutip ganda) adalah string literal, tipe yang sama sekali berbeda. Dua kesalahan itu sangat umum di awal belajar.

Ukurannya Tidak Tetap

Inilah kejutan terbesar bagi yang datang dari bahasa seperti Java. Standar C++ hanya menjamin ukuran minimum dan urutan relatifnya (short ≤ int ≤ long ≤ long long). Ukuran sebenarnya bergantung pada compiler dan platform-mu. Selalu cek dengan sizeof:

Di build Linux 64-bit yang umum, kamu akan melihat int = 4, long = 8. Namun di Windows 64-bit, long hanya 4 byte. Celah portabilitas itulah alasan kamu sebaiknya tidak menulis kode yang menganggap long selalu 64-bit.

Kalau kamu butuh lebar yang pasti, pakai tipe bilangan bulat fixed-width di <cstdint>:

Pakai int32_t/int64_t untuk format file, protokol jaringan, atau apa pun yang harus berperilaku sama di semua mesin. Perhatikan cast (int)a: mengirim tipe 8-bit ke stream akan mencetaknya sebagai karakter, bukan angka, jadi lakukan cast terlebih dulu.

Signed vs Unsigned

Setiap tipe bilangan bulat punya dua varian. Tipe signed bisa menyimpan bilangan negatif; tipe unsigned tidak bisa, dan sebagai gantinya punya batas atas positif yang lebih tinggi. int biasa bersifat signed secara default.

Mengurangi 0 yang unsigned akan berputar balik (wrap around) menjadi bilangan positif yang sangat besar, bukan menjadi negatif. Ini terus-menerus menjebak orang, terutama dengan size_t (tipe unsigned) yang dikembalikan oleh .size():

vector<int> v = {1, 2, 3};
// DANGER: v.size() is unsigned. If v is empty, v.size() - 1 wraps
// to a gigantic number and the loop runs nearly forever.
for (size_t i = 0; i <= v.size() - 1; i++) { /* ... */ }

Utamakan i < v.size() (jangan pernah <= size() - 1), atau hindari masalahnya sama sekali dengan range-based for loop.

Integer Overflow Adalah Undefined Behavior

Berbeda dengan wraparound pada unsigned (yang perilakunya terdefinisi dengan baik), overflow pada bilangan bulat signed adalah undefined behavior di C++. Compiler boleh melakukan apa saja: mengembalikan nilai sampah, menghapus pengecekannya lewat optimasi, atau membuat program crash:

Solusinya sama dengan jebakan overflow di bahasa mana pun: lakukan aritmetikanya di tipe yang lebih lebar. Cast salah satu operan ke long long sebelum +, supaya penjumlahannya terjadi dalam 64 bit. Melakukan cast pada hasilnya sesudahnya sudah terlambat, karena overflow-nya sudah terjadi.

Memilih Tipe yang Tepat

Untuk sebagian besar kode, pilihan default sudah cukup: int untuk bilangan bulat, double untuk bilangan desimal. Pakai yang lain hanya kalau kamu punya alasan.

TipeUkuran umumPakai saat
int32-bitPilihan default untuk bilangan bulat
long long64-bitNilai di atas ~2 miliar: timestamp, penghitung besar
double64-bitPilihan default untuk desimal, presisinya bagus
float32-bitArray yang hemat memori dan presisinya boleh berkurang
bool1 bytePenanda benar/salah
int32_t / int64_tpastiFormat lintas platform, protokol, manipulasi bit

Ada beberapa jebakan yang perlu diingat. float hanya punya sekitar 7 digit desimal yang signifikan, jadi 0.1f + 0.2f tidak persis 0.3. Utamakan double kecuali kamu benar-benar perlu menghemat memori. Selain itu, char bisa signed atau unsigned tergantung platform-nya, jadi kalau kamu melakukan aritmetika pada byte mentah, tulis signed char atau unsigned char secara eksplisit.

Berikutnya: Kata Kunci auto

Menulis tipe setiap kali lama-lama melelahkan, dan kadang tipenya panjang atau sulit disebutkan. C++ membiarkan compiler menyimpulkannya untukmu dengan kata kunci auto: auto x = 42; membuat x menjadi int, dan auto it = v.begin(); menghemat kamu dari mengetik tipe iterator yang panjang. Halaman berikutnya membahas kapan auto membuat kode lebih jelas dan kapan ia menyembunyikan terlalu banyak.

Pertanyaan yang sering diajukan

Apa saja tipe data dasar di C++?

Tipe dasarnya adalah bilangan bulat (short, int, long, long long), floating-point (float, double, long double), tipe karakter char, dan tipe boolean bool. Setiap tipe bilangan bulat juga bisa signed atau unsigned. Semua yang lain, seperti std::string, array, dan class buatanmu sendiri, dibangun di atas tipe-tipe ini.

Apa perbedaan int dan long di C++?

Keduanya menyimpan bilangan bulat, tetapi long dijamin setidaknya sama lebarnya dengan int (sering 64-bit di platform 64-bit, tetapi hanya 32-bit di Windows). Standar hanya menetapkan ukuran minimum, jadi untuk lebar yang pasti, pakai tipe fixed-width dari <cstdint> seperti int32_t dan int64_t.

Seberapa besar ukuran int di C++?

Standar hanya menjamin int setidaknya 16 bit, tetapi di hampir semua desktop dan server modern ukurannya 32 bit. Karena ukurannya bergantung pada platform, jangan pernah berasumsi: cetak sizeof(int) untuk mengeceknya, atau pakai tipe <cstdint> seperti int32_t kalau kamu butuh lebar yang pasti.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai