數據類型是 C++ 程序操縱內存的「標籤系統」,決定了位模式的解釋方式、佔用空間、取值範圍與允許操作。本文系統梳理 C++ 類型體系,結合內存模型與編譯器實現差異,為類型選型提供決策依據。

圖示:C++ 類型分為 基本類型 (算術類型+void)、複合類型 (數組/指針/引用)、用戶定義類型 (類/結構體/聯合體/枚舉)、標準庫類型 (string/vector/智能指針等)。
| 類型 | 關鍵字 | 最小位寬 | 典型尺寸 (64位系統) |
|---|---|---|---|
| 字符類型 | char / signed char / unsigned char | 8 位 | 1 字節 |
| 窄字符 | char16_t (C++11) | 16 位 | 2 字節 |
| 寬字符 | char32_t (C++11) / wchar_t | 16/32 位 | 2/4 字節 |
| 短整型 | short / short int | 16 位 | 2 字節 |
| 整型 | int | 16 位 | 4 字節 |
| 長整型 | long / long int | 32 位 | 4/8 字節 |
| 長長整型 | long long / long long int (C++11) | 64 位 | 8 字節 |
| 單精度浮點 | float | — | 4 字節 (IEEE 754 binary32) |
| 雙精度浮點 | double | — | 8 字節 (IEEE 754 binary64) |
| 擴展精度 | long double | — | 8/10/16 字節 (實現相關) |
| 布爾型 | bool | — | 1 字節 |
| 空類型 | void | — | 不完整類型,不可實例化 |
signed int // 等價 int,最高位為符號位 (二進制補碼)
unsigned int // 無符號,所有位表示數值,範圍擴大一倍
// 典型 16 位 short 範圍對比
signed short: -32,768 ~ 32,767 (0x8000 ~ 0x7FFF)
unsigned short: 0 ~ 65,535 (0x0000 ~ 0xFFFF)

十進制 85 → 二進制 00000000 01010101 (16位 short):

| 類型 | 符號位 | 指數位 | 尾數位 | 偏移量 | 有效數字 |
|---|---|---|---|---|---|
| float | 1 | 8 | 23 | 127 | ~7 位十進制 |
| double | 1 | 11 | 52 | 1023 | ~15 位十進制 |
| long double (x87) | 1 | 15 | 64 | 16383 | ~19 位十進制 |
規範化形式:值 = (-1)^符號 × 1.尾數 × 2^(指數-偏移)。隱含最高位 1 不存儲,實際精度分別為 24/53/65 位。
| 完整形式 | 常用簡寫 | 等價性 |
|---|---|---|
| short int | short | 完全等價 |
| long int | long | 完全等價 |
| long long int | long long | 完全等價 |
| unsigned int | unsigned | 完全等價 |
| unsigned short int | unsigned short | 完全等價 |
| unsigned long int | unsigned long | 完全等價 |
12, 0, -3, 0xFF, 0b10104.6, -1.23, 3.14e-10'a', '\n', L'中', u8'中'"hello", L"寬", R"(raw)"true, falsenullptr (C++11)constexpr long double operator"" _km(long double d) { return d * 1000; }
auto len = 5.5_km; // 5500.0 (long double)
double (默認) / float (內存敏感) / long double (高精度)unsigned 系列 (uint32_t 等固定寬度類型)short / int16_tint / int32_t (默認首選)long long / int64_t<cstdint> 提供 int8_t..int64_t, uint8_t..uint64_tchar,Unicode 用 char8_t/char16_t/char32_t (C++20)| 類型 | Windows (MSVC, 64位) | Linux/macOS (GCC/Clang, 64位) |
|---|---|---|
| long | 4 字節 | 8 字節 |
| long double | 8 字節 (同 double) | 16 字節 (80位擴展精度) |
| wchar_t | 2 字節 (UTF-16) | 4 字節 (UTF-32) |
| 指針 | 8 字節 | 8 字節 |
最佳實踐:跨平台代碼務必使用<cstdint>固定寬度類型 (int32_t,uint64_t等),避免依賴long、wchar_t等實現相關類型。
利用 指針 + 結構體 可構建任意複雜數據結構:
struct Node { T data; Node* next; };struct TreeNode { T val; TreeNode *left, *right; };vector> 或鄰接矩陣auto x = 42; // int
auto y = 3.14; // double
auto p = &x; // int*
decltype(x) z = 0; // int
<type_traits>static_assert(std::is_integral_v);
static_assert(std::is_floating_point_v);
static_assert(sizeof(int) == 4); // 編譯期斷言
template<std::integral T>
T add(T a, T b) { return a + b; } // 僅接受整型
C++ 類型系統以 基本算術類型 為基石,通過 修飾符 (signed/unsigned/short/long)、複合構造 (指針/引用/數組)、用戶定義 (class/struct/union/enum) 構建龐大類型宇宙。掌握 尺寸/範圍/表示法/編譯器差異,善用 <cstdint> 固定寬度類型、constexpr 編譯期計算、auto/概念輔助推導,能編寫出高效、可移植、類型安全的現代 C++ 代碼。