Bỏ qua để đến nội dung

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ố.

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.

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;
}

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;
}
  • sizeof(kieu_du_lieu) hoặc sizeof(bien) cho biết kích thước (byte) tại thời điểm biên dịch
  • std::numeric_limits<T>::min()/max() (từ <limits>) cho biết giới hạn giá trị của kiểu T
  • 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