sizeof & giới hạn kiểu dữ liệu
Vì các kiểu số trong C++ có kích thước cố định, bạn cần biết cách kiểm tra kích thước và giới hạn giá trị của chúng để tránh lỗi tràn số.
Toán tử sizeof
Phần tiêu đề “Toán tử sizeof”sizeof trả về kích thước (tính bằng byte) mà một kiểu dữ liệu hoặc biến chiếm trong bộ nhớ:
#include <iostream>
int main() { int a = 10; std::cout << sizeof(a) << std::endl; // 4 (kích thước của biến a) std::cout << sizeof(int) << std::endl; // 4 (kích thước của kiểu int) std::cout << sizeof(double) << std::endl; // 8 std::cout << sizeof(char) << std::endl; // 1 std::cout << sizeof(bool) << std::endl; // 1
return 0;}sizeof được tính ở thời điểm biên dịch (compile-time), không phải lúc chạy chương trình - đây là lý do nó rất nhanh và không có overhead.
Giới hạn giá trị với <limits>
Phần tiêu đề “Giới hạn giá trị với <limits>”Thư viện <limits> cho phép truy vấn giá trị nhỏ nhất/lớn nhất mà một kiểu dữ liệu có thể chứa:
#include <iostream>#include <limits>
int main() { std::cout << "int min: " << std::numeric_limits<int>::min() << std::endl; std::cout << "int max: " << std::numeric_limits<int>::max() << std::endl; std::cout << "double max: " << std::numeric_limits<double>::max() << std::endl;
return 0;}Tràn số (Integer Overflow)
Phần tiêu đề “Tràn số (Integer Overflow)”Khi một phép tính vượt quá giới hạn của kiểu dữ liệu, C++ không báo lỗi mà giá trị sẽ “quay vòng” (wrap around) - đây là một cạm bẫy phổ biến (xem thêm ở phần What the C++):
#include <iostream>#include <limits>
int main() { int max_int = std::numeric_limits<int>::max(); std::cout << max_int << std::endl; // 2147483647 std::cout << max_int + 1 << std::endl; // -2147483648 (!) - tràn số, quay vòng về âm return 0;}Tổng kết
Phần tiêu đề “Tổng kết”sizeof(kieu_du_lieu)hoặcsizeof(bien)cho biết kích thước (byte) tại thời điểm biên dịchstd::numeric_limits<T>::min()/max()(từ<limits>) cho biết giới hạn giá trị của kiểuT- Vượt quá giới hạn kiểu số nguyên gây ra tràn số (overflow) mà không có cảnh báo - hãy chọn kiểu dữ liệu đủ lớn cho bài toán của bạn