Hampir setiap program menghitung sesuatu: jumlah stok barang, banyaknya pengunjung, tahun lahir, atau sisa kapasitas ruangan. Nilai-nilai seperti itu tidak butuh pecahan — cukup bilangan bulat. Integer adalah tipe data PHP untuk bilangan bulat tersebut, dan pada Chapter ini kita bedah cara PHP menyimpannya, seberapa jauh rentang nilainya, cara menuliskannya dalam berbagai basis bilangan, serta perilaku pembagian yang sering mengejutkan pemula.
Apa itu Integer #
Integer adalah bilangan bulat tanpa bagian pecahan: bisa positif, negatif, atau nol. Ketika Anda menulis 250 (tanpa titik desimal), PHP menyimpannya sebagai integer. Fungsi var_dump() menampilkan tipe dan nilai sekaligus, sehingga menjadi alat utama kita untuk mengamati tipe data:
<?php
$jumlahStok = 250;
$temperatur = -5;
$tahunLahir = 2001;
var_dump($jumlahStok, $temperatur, $tahunLahir);
var_dump(is_int($jumlahStok));Output yang Dihasilkan:
int(250)
int(-5)
int(2001)
bool(true)Mari kita telaah keluaran di atas: var_dump() mencetak tipe (int) diikuti nilainya dalam kurung, satu baris untuk setiap nilai. Ketiga variabel — termasuk $temperatur yang bernilai negatif — terdeteksi sebagai int. Baris terakhir menunjukkan is_int() yang mengembalikan true ketika argumennya bertipe integer; fungsi ini berguna untuk memeriksa tipe saat program berjalan.
Rentang Nilai dan Batas 64-bit #
PHP tidak menyimpan integer dengan ukuran bebas. Pada build PHP modern 64-bit, integer disimpan sebagai bilangan bertanda 64-bit, sehingga rentangnya terbatas. PHP menyediakan tiga konstanta untuk memeriksa batas tersebut di build yang Anda pakai:
<?php
var_dump(PHP_INT_SIZE);
var_dump(PHP_INT_MAX);
var_dump(PHP_INT_MIN);Output yang Dihasilkan:
int(8)
int(9223372036854775807)
int(-9223372036854775808)Nilai PHP_INT_SIZE adalah 8 yang berarti 8 byte (64 bit). Dengan 64 bit, nilai terbesar yang dapat ditampung adalah 9223372036854775807 (kurang lebih 9,2 kuintiliun) dan terkecil adalah -9223372036854775808. Lalu apa yang terjadi jika hasil perhitungan melewati batas itu? Mari kita coba langsung:
<?php
$melebihiBatas = PHP_INT_MAX + 1;
var_dump($melebihiBatas);Output yang Dihasilkan:
float(9.223372036854776E+18)PHP tidak melaporkan error sama sekali. Sebagai gantinya, hasil perhitungan yang melewati PHP_INT_MAX otomatis dikonversi menjadi tipe floating-point (float), terlihat dari notasi E+18 pada keluaran. Konversi ini diperlukan karena tidak ada representasi integer untuk nilai sebesar itu, tetapi akurasinya berubah — float hanya menyimpan sekitar 15-16 digit signifikan, sementara integer 64-bit menyimpan 19 digit secara persis.
Menulis Integer dalam Berbagai Basis #
Sejauh ini kita menulis angka dalam basis desimal (basis 10). PHP juga menerima tiga basis lain yang lazim di dunia pemrograman: heksadesimal (basis 16, diawali 0x), oktal (basis 8, diawali 0o), dan biner (basis 2, diawali 0b). Keempat penulisan berikut menghasilkan nilai integer yang sama:
<?php
var_dump(26, 0x1A, 0b11010, 0o32);
var_dump(0o755, 0o644); // izin berkas di Linux
var_dump(1_000_000); // garis bawah pembaca
Output yang Dihasilkan:
int(26)
int(26)
int(26)
int(26)
int(493)
int(420)
int(1000000)Baris pertama membuktikan 26 desimal, 0x1A heksadesimal, 0b11010 biner, dan 0o32 oktal adalah nilai yang identik: int(26). Notasi oktal pada baris kedua adalah cara menulis izin berkas di Linux — 0o755 berarti pemilik boleh membaca, menulis, dan mengeksekusi, sementara yang lain hanya membaca dan mengeksekusi. Garis bawah pada 1_000_000 murni pembantu pembacaan; PHP mengabaikannya sehingga nilainya tetap satu juta.
Dua kebiasaan penulisan yang perlu diketahui: oktal juga boleh ditulis dengan awalan nol saja (0755) — bentuk lama yang masih didukung, dan garis bawah baru tersedia sejak PHP 7.4 serta hanya berlaku di literal angka, bukan di dalam string.
Basis oktal menyimpan satu jebakan klasik. Simpan kode berikut sebagai oktal.php lalu jalankan:
<?php
var_dump(08);Output yang Dihasilkan:
Parse error: Invalid numeric literal in /home/z/my-project/php-course/content/php/tipe-data-dan-type-system/integers/.verify_tmp.php on line 2Angka 8 tidak ada dalam basis oktal (digitnya hanya 0-7), sehingga penulisan 08 ditolak parser sejak awal dengan Parse error. Pesannya jujur menunjuk masalah — literal numerik tidak valid — beserta berkas dan baris kejadian. Bedanya dengan warning, parse error menghentikan program sebelum satu baris pun dieksekusi; membaca pesan error seperti ini sudah kita latih pada Chapter Memahami PHP Errors
.
Pembagian dan Sisa Bagi #
Operasi aritmetika pada integer umumnya menghasilkan integer — kecuali pembagian. Operator / mengembalikan float setiap kali hasilnya tidak habis dibagi:
<?php
var_dump(7 / 2);
var_dump(10 / 5);
var_dump(20 / 4);Output yang Dihasilkan:
float(3.5)
int(2)
int(5)Perhatikan polanya: 7 / 2 menghasilkan float(3.5) karena ada bagian pecahan, sedangkan 10 / 5 dan 20 / 4 menghasilkan int karena hasilnya bilangan bulat. Jika Anda ingin hasil pembagian selalu berupa integer, PHP menyediakan fungsi intdiv() yang membuang bagian pecahan:
<?php
var_dump(intdiv(7, 2));
var_dump(intdiv(-7, 2));Output yang Dihasilkan:
int(3)
int(-3)Hasil intdiv(-7, 2) adalah -3, bukan -4: fungsi ini memotong ke arah nol (truncation), bukan membulatkan ke bawah. Operator sisa bagi % melengkapi pasangan ini, dan tandanya mengikuti bilangan yang dibagi:
<?php
var_dump(10 % 3);
var_dump(-10 % 3);Output yang Dihasilkan:
int(1)
int(-1)Dua aturan di atas konsisten satu sama lain: intdiv(-7, 2) * 2 + (-7 % 2) kembali menghasilkan -7. Kombinasi intdiv() dan % adalah resep standar untuk memecah satuan waktu, seperti mengubah total detik menjadi jam-menit-detik:
<?php
$totalDetik = 7543;
$jam = intdiv($totalDetik, 3600);
$sisaDetik = $totalDetik % 3600;
$menit = intdiv($sisaDetik, 60);
$detik = $sisaDetik % 60;
echo "$totalDetik detik = $jam jam $menit menit $detik detik\n";Output yang Dihasilkan:
7543 detik = 2 jam 5 menit 43 detikMari kita bedah hitungannya: 7543 dibagi 3600 menghasilkan 2 jam dengan sisa 343 detik (7543 % 3600), lalu 343 detik dipecah lagi menjadi 5 menit dan 43 detik. Perhitungan seperti ini tetap presisi karena seluruhnya bekerja di dunia integer.
Satu larangan terakhir yang wajib diingat: sisa bagi dengan nol. Simpan berikut sebagai bagi-nol.php:
<?php
$sisa = 10 % 0;Output yang Dihasilkan:
Fatal error: Uncaught DivisionByZeroError: Modulo by zero in /home/z/my-project/php-course/content/php/tipe-data-dan-type-system/integers/.verify_tmp.php:2
Stack trace:
#0 {main}
thrown in /home/z/my-project/php-course/content/php/tipe-data-dan-type-system/integers/.verify_tmp.php on line 2PHP menghentikan program dengan DivisionByZeroError — baik untuk % maupun intdiv(). Error ini tidak bisa dihindari dengan memeriksa hasil; satu-satunya jalan adalah memastikan pembagi tidak nol sebelum operasi dilakukan, misalnya dengan if ($pembagi !== 0).
Ringkasan #
Integer menyimpan bilangan bulat dalam 64 bit dengan rentang PHP_INT_MIN hingga PHP_INT_MAX; melebihi batas atas secara diam-diam menghasilkan float. Angka dapat ditulis dalam basis desimal, heksadesimal, oktal, dan biner, dengan garis bawah sebagai pembantu pembacaan. Operator / menghasilkan float saat ada pecahan, intdiv() memotong ke arah nol, % mengambil sisa dengan tanda mengikuti pembilang. Ketika presisi pecahan benar-benar dibutuhkan, kita berpindah ke tipe berikutnya: floating-point — beserta keunikan dan jebakannya sendiri.
Referensi #
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
contoh.php
Unduh berkas<?php
// contoh.php — rangkuman Chapter Integers
// Jalankan dengan: php contoh.php
echo "== Rentang integer ==\n";
echo "PHP_INT_SIZE: " . PHP_INT_SIZE . " byte\n";
echo "PHP_INT_MAX : " . PHP_INT_MAX . "\n";
echo "PHP_INT_MIN : " . PHP_INT_MIN . "\n";
echo "\n== Overflow menjadi float ==\n";
$melebihi = PHP_INT_MAX + 1;
var_dump($melebihi);
echo "\n== Berbagai basis bilangan ==\n";
var_dump(26, 0x1A, 0b11010, 0o32);
var_dump(0o755, 0o644);
var_dump(1_000_000);
echo "\n== Pembagian, intdiv, dan modulo ==\n";
var_dump(7 / 2, 10 / 5);
var_dump(intdiv(7, 2), intdiv(-7, 2));
var_dump(10 % 3, -10 % 3);
echo "\n== Memecah detik menjadi jam-menit-detik ==\n";
$totalDetik = 7543;
$jam = intdiv($totalDetik, 3600);
$sisaDetik = $totalDetik % 3600;
$menit = intdiv($sisaDetik, 60);
$detik = $sisaDetik % 60;
echo "$totalDetik detik = $jam jam $menit menit $detik detik\n";