Batas Numerik dan Perilaku Luapan
Periksa std::numeric_limits dan pahami aturan luapan bertanda serta tak bertanda
Batas Numerik dan Perilaku Luapan adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Mengapa Batas Nilai Penting
Setiap tipe numerik memiliki nilai maksimum dan minimum yang dapat direpresentasikan. Melebihinya dapat secara diam-diam menghasilkan keluaran yang salah — atau perilaku tidak terdefinisi.
std::numeric_limits
Periksa batas nilai tipe numerik apa pun dengan header <limits>. Konstanta pada waktu kompilasi — tanpa biaya saat runtime.
#include <limits>
std::cout << std::numeric_limits<int>::max() << "\n";
std::cout << std::numeric_limits<int>::min() << "\n";
std::cout << std::numeric_limits<double>::epsilon();Pemeriksaan Umum
Anggota yang paling berguna:
max()— nilai terbesarmin()— nilai terkecil (positif)lowest()— nilai paling negatifepsilon()— perbedaan terkecil yang bermakna (bilangan pecahan)digits10— digit desimal yang dijamin
Luapan Bilangan Bulat Bertanda
Luapan bilangan bulat bertanda adalah perilaku tidak terdefinisi. Kompilator dapat menganggapnya tidak pernah terjadi, sehingga menghasilkan optimasi yang mengejutkan.
int x = std::numeric_limits<int>::max();
x += 1; // UB — anything can happenPeluapan Bilangan Bulat Tak Bertanda
Peluapan bilangan tak bertanda memiliki perilaku yang terdefinisi — nilainya berputar menurut modulo 2^N. Ini terkadang berguna, tetapi sering menjadi sumber kesalahan.
unsigned int u = 0;
u -= 1; // wraps to 4,294,967,295 (UINT_MAX)Peluapan dan Kekurangan Aliran Bilangan Pecahan
Bilangan pecahan meluap menjadi inf, bukan menyebabkan program berhenti. Kekurangan aliran menghasilkan bilangan subnormal atau 0.
double x = 1e308;
x *= 100;
std::cout << x; // infMendeteksi Luapan dengan Aman
Untuk bilangan bulat bertanda, lakukan pemeriksaan sebelum operasi. Kompilator menyediakan pembantu aritmetika terperiksa bawaan seperti __builtin_add_overflow pada GCC/Clang.
if (a > std::numeric_limits<int>::max() - b) {
// overflow would happen
}
int sum = a + b;C++20 std::ssize dan std::cmp_less
C++20 menambahkan pembantu perbandingan bilangan bulat yang aman di <utility>: std::cmp_equal, cmp_less, cmp_greater. Pembantu ini menangani pencampuran bilangan bertanda dan tak bertanda dengan benar.
Konversi Implisit Itu Menipu
Mencampur bilangan bertanda dan tak bertanda dalam perbandingan secara diam-diam mengonversi operan bertanda menjadi tak bertanda — sumber umum bug yang sulit ditemukan.
int a = -1;
unsigned int b = 1;
if (a < b) std::cout << "yes";
else std::cout << "no"; // prints "no"!Pemeriksaan Waktu Kompilasi
Gunakan static_assert untuk menegakkan asumsi ukuran saat menulis kode portabel.
static_assert(sizeof(int) >= 4, "Need at least 32-bit int");Sanitizer Membantu dalam Pengujian
Bangun program dengan -fsanitize=undefined untuk menangkap luapan bilangan bertanda saat runtime selama pengujian.
g++ -fsanitize=undefined -O1 main.cppPemeriksaan Singkat
Apa yang terjadi saat penjumlahan bilangan bulat bertanda meluap dalam C++?
Ringkasan
Gunakan std::numeric_limits untuk memeriksa batas tipe. Luapan bertanda tidak terdefinisi; luapan tak bertanda berputar. Campurkan bilangan bertanda dan tak bertanda dengan risiko Anda sendiri. Sanitizer dan perbandingan aman C++20 membantu melindungi kode Anda.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Batas Numerik dan Perilaku Luapan” gratis?
Ya — teks lengkap “Batas Numerik dan Perilaku Luapan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Batas Numerik dan Perilaku Luapan”?
Periksa std::numeric_limits dan pahami aturan luapan bertanda serta tak bertanda Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Batas Numerik dan Perilaku Luapan” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Tipe Bilangan Bulat vs Titik Mengambang
- Header cmath: pow, sqrt, abs, round
- Bilangan Acak dengan Header random
- Batas Numerik dan Perilaku Luapan