Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Phạm vi kiểu dữ liệu và Macro trong C++

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ĩaGiá trị điển hình (32-bit)
CHAR_BITSố bit trong char8
CHAR_MINGiá trị nhỏ nhất của char-128 (signed) / 0 (unsigned)
CHAR_MAXGiá trị lớn nhất của char127 / 255
SCHAR_MIN, SCHAR_MAXSigned char-128, 127
UCHAR_MAXUnsigned char255
SHRT_MIN, SHRT_MAXShort int-32768, 32767
USHRT_MAXUnsigned short65535
INT_MIN, INT_MAXInt-2147483648, 2147483647
UINT_MAXUnsigned int4294967295
LONG_MIN, LONG_MAXLong int-2147483648 (32-bit) / -9.22e18 (64-bit)
ULONG_MAXUnsigned long4294967295 / 1.84e19
LLONG_MIN, LLONG_MAXLong long (C++11)-9.22e18, 9.22e18
ULLONG_MAXUnsigned long long1.84e19

Macro cho Floating-point (<cfloat>)

MacroÝ nghĩaGiá trị điển hình (IEEE 754)
FLT_MINFloat dương nhỏ nhất chuẩn hóa1.17549e-38
FLT_MAXFloat lớn nhất3.40282e+38
DBL_MINDouble dương nhỏ nhất chuẩn hóa2.22507e-308
DBL_MAXDouble lớn nhất1.79769e+308
LDBL_MIN, LDBL_MAXLong doublePhụ thuộc implementation
FLT_DIGSố chữ số thập phân chính xác (float)6
DBL_DIGSố 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ố.
  • char có thể signed hoặc unsigned tùy implementation.
  • long 32-bit trên Windows 64-bit, 64-bit trên Linux 64-bit.