Tabel rentang pada bab Tipe Numerik menunjukkan setiap tipe punya batas atas dan batas bawah. Pertanyaannya: apa yang terjadi ketika hasil perhitungan melewati batas tersebut? Pada pengaturan bawaan, C# tidak memunculkan error; nilainya berputar. Perilaku ini bernama overflow, dan bab ini menunjukkan cara mendeteksinya dengan mode checked.

Bagaimana Overflow Terjadi #

int menyimpan nilai dalam 32 bit. Pola bit int.MaxValue adalah 31 bit bernilai 1 berturut-turut; menambah satu membalik pola menjadi satu bit 1 diikuti 31 bit 0 — pola yang dalam representasi two’s complement justru bernilai -2147483648. Runtime mengeksekusi penjumlahan itu tanpa keluhan:

csharp
int maksimum = int.MaxValue;
Console.WriteLine(maksimum);

int melebihi = maksimum + 1;
Console.WriteLine(melebihi);

byte posisiTerakhir = 255;
posisiTerakhir++;
Console.WriteLine(posisiTerakhir);

Output yang Dihasilkan:

text
2147483647
-2147483648
0

Mari kita telaah baris demi baris:

  1. Baris 1-2: int.MaxValue menampilkan batas atas int, yaitu 2147483647.
  2. Baris 4-5 (maksimum + 1): Penjumlahan melewati batas; nilai melompat ke ujung bawah rentang: -2147483648. Peristiwa ini disebut wrap around.
  3. Baris 7-8 (posisiTerakhir++): byte berperilaku sama pada skala kecil: 255 bertambah satu lalu berputar ke 0.

Perilaku bawaan ini disebut konteks unchecked. Runtime menghitung operasi apa adanya pada bit tanpa memeriksa batas — cepat, tetapi hasilnya dapat melompat tanpa terlihat. Perputaran nilai kadang dimanfaatkan sengaja untuk hitungan yang harus kembali ke nol, misalnya penomoran siklus. Di luar kasus khusus tersebut, pelompatan nilai justru sumber bug yang sulit dilacak, karena program terus berjalan seolah tidak ada yang salah.

Mode checked: Membuat Overflow Terdeteksi #

Keyword checked memerintahkan runtime memeriksa operasi aritmetika di dalam bloknya. Overflow yang terdeteksi memicu OverflowException:

csharp
int maksimum = int.MaxValue;
Console.WriteLine(maksimum);

checked
{
    int melebihi = maksimum + 1;
    Console.WriteLine(melebihi);
}

Output yang Dihasilkan:

text
2147483647
Unhandled exception. System.OverflowException: Arithmetic operation resulted in an overflow.
   at Program.<Main>$(String[] args) in Program.cs:line 6

Program berhenti dengan exception System.OverflowException. Baris at Program... adalah bagian stack trace yang menunjuk lokasi operasi pemicu; jejak lengkapnya lebih panjang lagi. Kebalikannya, keyword unchecked menandai blok agar dihitung tanpa pemeriksaan — sama dengan perilaku bawaan, tetapi ditulis eksplisit. Sifat checked juga dapat diaktifkan untuk seluruh project lewat properti CheckForOverflowUnderflow pada file .csproj.

Pemeriksaan menambah sedikit biaya pada setiap operasi aritmetika. Karena itu mode bawaan C# memilih unchecked, dan checked diaktifkan secara selektif pada bagian perhitungan yang tidak boleh meleset.