Mỗi kiểu dữ liệu trong C++ có phạm vi giá trị nhất định. Để tránh ghi nhớ các con số lớn, C/C++ cung cấp các macro trong header <climits> (cho integer) và <cfloat> (cho floating-point).
Macro phổ biến cho Integer (<climits>)
| Macro | Ý nghĩa | Giá trị điển hình (32-bit) |
|---|---|---|
CHAR_BIT | Số bit trong char | 8 |
CHAR_MIN | Giá trị nhỏ nhất của char | -128 (signed) / 0 (unsigned) |
CHAR_MAX | Giá trị lớn nhất của char | 127 / 255 |
SCHAR_MIN, SCHAR_MAX | Signed char | -128, 127 |
UCHAR_MAX | Unsigned char | 255 |
SHRT_MIN, SHRT_MAX | Short int | -32768, 32767 |
USHRT_MAX | Unsigned short | 65535 |
INT_MIN, INT_MAX | Int | -2147483648, 2147483647 |
UINT_MAX | Unsigned int | 4294967295 |
LONG_MIN, LONG_MAX | Long int | -2147483648 (32-bit) / -9.22e18 (64-bit) |
ULONG_MAX | Unsigned long | 4294967295 / 1.84e19 |
LLONG_MIN, LLONG_MAX | Long long (C++11) | -9.22e18, 9.22e18 |
ULLONG_MAX | Unsigned long long | 1.84e19 |
Macro cho Floating-point (<cfloat>)
| Macro | Ý nghĩa | Giá trị điển hình (IEEE 754) |
|---|---|---|
FLT_MIN | Float dương nhỏ nhất chuẩn hóa | 1.17549e-38 |
FLT_MAX | Float lớn nhất | 3.40282e+38 |
DBL_MIN | Double dương nhỏ nhất chuẩn hóa | 2.22507e-308 |
DBL_MAX | Double lớn nhất | 1.79769e+308 |
LDBL_MIN, LDBL_MAX | Long double | Phụ thuộc implementation |
FLT_DIG | Số chữ số thập phân chính xác (float) | 6 |
DBL_DIG | Số chữ số thập phân chính xác (double) | 15 |
Ví dụ in tất cả phạm vi
#include <iostream>
#include <climits>
#include <cfloat>
using namespace std;
int main() {
cout << "=== Integer ranges ===\n";
cout << "char: " << CHAR_MIN << " to " << CHAR_MAX << '\n';
cout << "signed char: " << SCHAR_MIN << " to " << SCHAR_MAX << '\n';
cout << "unsigned char: 0 to " << UCHAR_MAX << '\n';
cout << "short: " << SHRT_MIN << " to " << SHRT_MAX << '\n';
cout << "unsigned short: 0 to " << USHRT_MAX << '\n';
cout << "int: " << INT_MIN << " to " << INT_MAX << '\n';
cout << "unsigned int: 0 to " << UINT_MAX << '\n';
cout << "long: " << LONG_MIN << " to " << LONG_MAX << '\n';
cout << "unsigned long: 0 to " << ULONG_MAX << '\n';
cout << "long long: " << LLONG_MIN << " to " << LLONG_MAX << '\n';
cout << "unsigned long long: 0 to " << ULLONG_MAX << '\n';
cout << "\n=== Floating-point ranges ===\n";
cout << "float: " << FLT_MIN << " to " << FLT_MAX << " (digits: " << FLT_DIG << ")\n";
cout << "double: " << DBL_MIN << " to " << DBL_MAX << " (digits: " << DBL_DIG << ")\n";
cout << "long double: " << LDBL_MIN << " to " << LDBL_MAX << '\n';
return 0;
}
Đầu ra (điển hình 64-bit Linux)
=== Integer ranges === char: -128 to 127 signed char: -128 to 127 unsigned char: 0 to 255 short: -32768 to 32767 unsigned short: 0 to 65535 int: -2147483648 to 2147483647 unsigned int: 0 to 4294967295 long: -9223372036854775808 to 9223372036854775807 unsigned long: 0 to 18446744073709551615 long long: -9223372036854775808 to 9223372036854775807 unsigned long long: 0 to 18446744073709551615 === Floating-point ranges === float: 1.17549e-38 to 3.40282e+38 (digits: 6) double: 2.22507e-308 to 1.79769e+308 (digits: 15) long double: 3.3621e-4932 to 1.18973e+4932
C++11: <cstdint> - Kiểu kích thước cố định
Thay vì phụ thuộc macro, dùng kiểu rõ ràng:
int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t
Lưu ý
- Giá trị thực tế phụ thuộc platform/compiler. Luôn dùng macro thay vì hardcode số.
charcó thể signed hoặc unsigned tùy implementation.long32-bit trên Windows 64-bit, 64-bit trên Linux 64-bit.