Tipe int adalah tipe bilangan bulat paling umum dipakai di C. Hampir semua perhitungan yang melibatkan hitungan, indeks, atau status memakai int sebagai pilihan default. Pada Chapter ini kita akan memetakan ukuran int di platform modern, batas nilai yang bisa ditampung, serta perilaku pembagian dan sisa pembagian yang sering membingungkan pemula. Setelah memahami tipe int, kita bisa memilih tipe integer lain seperti long atau short dengan keyakinan kapan masing-masing lebih tepat dipakai.

Karakteristik Dasar int #

Tipe int menampung bilangan bulat bertanda, yang berarti bisa positif, nol, maupun negatif. Pada platform modern (x86_64 Linux/macOS/Windows), sizeof(int) == 4 dengan rentang nilai dari -2.147.483.648 (INT_MIN) hingga 2.147.483.647 (INT_MAX). Standar C hanya menjamin int minimal 16 bit; ukuran 4 byte yang kita pakai sehari-hari adalah keputusan ABI (Application Binary Interface) dari sistem operasi dan compiler modern.

c
#include <stdio.h>
#include <limits.h>

int main(void) {
    int a = 42;
    int b = -17;
    int c = 0;

    printf("a = %d, b = %d, c = %d\n", a, b, c);
    printf("ukuran int = %zu byte\n", sizeof(int));
    printf("INT_MIN    = %d\n", INT_MIN);
    printf("INT_MAX    = %d\n", INT_MAX);
    return 0;
}

Output yang Dihasilkan:

text
a = 42, b = -17, c = 0
ukuran int = 4 byte
INT_MIN    = -2147483648
INT_MAX    = 2147483647

Mari kita telaah baris-baris kode di atas:

  1. Baris 2 (#include <limits.h>): header yang menyediakan konstanta batas tipe integer seperti INT_MIN, INT_MAX, UINT_MAX.
  2. Baris 5 (int a = 42;): 42 adalah literal bertipe int yang disimpan dalam 4 byte memori.
  3. Baris 6 (int b = -17;): nilai negatif ditulis langsung dengan tanda minus; komputer menyimpannya dalam representasi two’s complement.
  4. Baris 10 (sizeof(int)): operator sizeof menghasilkan jumlah byte tipe int bertipe size_t; format specifier %zu dipakai untuk mencetaknya.
  5. Baris 11-12 (INT_MIN, INT_MAX): konstanta dari limits.h yang menyatakan batas terkecil dan terbesar yang bisa ditampung int.

Operasi Aritmetika pada int #

Operasi aritmetika standar pada int mencakup penjumlahan (+), pengurangan (-), perkalian (*), pembagian (/), dan sisa pembagian (%). Yang penting dipahami: pembagian antara dua int menghasilkan int dengan pembulatan ke arah nol, bukan pembulatan ke bawah. Artinya -7 / 2 menghasilkan -3, bukan -4. Operator % menghasilkan sisa pembagian; tandanya mengikuti pembilang pada C99 dan setelahnya.

c
#include <stdio.h>

int main(void) {
    int panjang = 12;
    int lebar = 8;

    /* Operasi aritmetika standar */
    int luas = panjang * lebar;
    int keliling = 2 * (panjang + lebar);

    printf("panjang   = %d\n", panjang);
    printf("lebar     = %d\n", lebar);
    printf("luas      = %d\n", luas);
    printf("keliling  = %d\n", keliling);

    /* Pembagian integer: hasil dibulatkan ke bawah */
    int bagi = panjang / 5;
    int sisa = panjang % 5;
    printf("12 / 5    = %d\n", bagi);
    printf("12 %% 5    = %d\n", sisa);
    return 0;
}

Output yang Dihasilkan:

text
panjang   = 12
lebar     = 8
luas      = 96
keliling  = 40
12 / 5    = 2
12 % 5    = 2

Pada baris 9, perkalian panjang * lebar dievaluasi menjadi 96 sebelum ditugaskan ke luas. Pada baris 16, pembagian 12 / 5 secara matematis adalah 2.4, tetapi karena kedua operan bertipe int, hasilnya juga bertipe int dan dibulatkan ke 2. Pada baris 17, sisa pembagian 12 % 5 menghasilkan 2 karena 12 = 5 * 2 + 2. Tanda %% di string literal baris 18 diperlukan karena % adalah penanda format specifier; untuk mencetak tanda % literal, kita tulis %%.

Literal Integer dengan Berbagai Basis #

Literal int biasanya ditulis dalam basis desimal, tetapi C mendukung tiga basis penulisan: desimal, heksadesimal (diawali 0x atau 0X), dan oktal (diawali 0). Pemilihan basis biasanya didasarkan pada konteks: heksadesimal dipakai untuk alamat memori, mask bit, dan kode warna; oktal jarang dipakai modern tetapi masih muncul pada kode warisan (terutama izin file Unix).

c
#include <stdio.h>

int main(void) {
    /* Literal dengan suffix: format desimal, heksadesimal, oktal */
    int dec = 255;
    int hex = 0xFF;        /* 255 dalam heksadesimal */
    int oct = 0377;        /* 255 dalam oktal */

    printf("desimal    = %d\n", dec);
    printf("heksadesimal = %d (ditulis 0xFF)\n", hex);
    printf("oktal      = %d (ditulis 0377)\n", oct);
    return 0;
}

Output yang Dihasilkan:

text
desimal    = 255
heksadesimal = 255 (ditulis 0xFF)
oktal      = 255 (ditulis 0377)

Pada baris 6, 0xFF menunjukkan FF sebagai angka heksadesimal (1516 + 15 = 255). Pada baris 7, 0377 menunjukkan 377 sebagai angka oktal (364 + 78 + 7 = 255). Perhatikan bahwa angka desimal yang ditulis dengan leading zero seperti 0377 akan dianggap oktal—kesalahan umum pemula yang menulis 012 mengharapkan 12 padahal sebenarnya bernilai 10 (18 + 2).

Memilih Format Specifier yang Tepat #

printf memakai format specifier untuk menentukan bagaimana argumen ditampilkan. Untuk int, specifier yang paling umum adalah %d (desimal bertanda) dan %i (setara). Jika argumen adalah unsigned int, gunakan %u. Hexadesimal dicetak dengan %x (huruf kecil) atau %X (huruf besar). Penggunaan specifier yang salah—misalnya mencetak unsigned int dengan %d—tidak selalu terlihat salah secara visual tetapi merupakan undefined behavior dan bisa menampilkan nilai negatif yang tidak diharapkan.

Default int untuk Beberapa Konteks #

Beberapa kata kunci di C secara implisit memakai tipe int jika kita tidak menyebutkan tipe eksplisit. Misalnya, unsigned tanpa tipe berarti unsigned int, dan signed tanpa tipe berarti signed int. Demikian juga const x = 5; dianggap const int x = 5; pada C lama—meskipun C99 dan setelahnya mewajibkan tipe eksplisit. Untuk kejelasan dan kompabilitas dengan compiler modern, selalu tulis tipe secara lengkap.

Dengan dasar ini, kita siap membandingkan int dengan tipe pecahan float dan double pada Chapter berikutnya.