首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 數據類型全景圖:從基本類型到複雜結構的內存佈局與選型指南

     編輯:關於C語言

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

一、C++ 類型分類體系

C++ 數據類型分類圖

圖示:C++ 類型分為 基本類型 (算術類型+void)、複合類型 (數組/指針/引用)、用戶定義類型 (類/結構體/聯合體/枚舉)、標準庫類型 (string/vector/智能指針等)。

二、基本算術類型:尺寸、範圍與表示

1. 標準規定的最小尺寸保證

類型關鍵字最小位寬典型尺寸 (64位系統)
字符類型char / signed char / unsigned char8 位1 字節
窄字符char16_t (C++11)16 位2 字節
寬字符char32_t (C++11) / wchar_t16/32 位2/4 字節
短整型short / short int16 位2 字節
整型int16 位4 字節
長整型long / long int32 位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—不完整類型,不可實例化

2. 有符號與無符號修飾符

signed int   // 等價 int,最高位為符號位 (二進制補碼)
unsigned int // 無符號,所有位表示數值,範圍擴大一倍

// 典型 16 位 short 範圍對比
signed short:   -32,768 ~ 32,767  (0x8000 ~ 0x7FFF)
unsigned short: 0 ~ 65,535        (0x0000 ~ 0xFFFF)

有符號無符號內存佈局

3. 整數二進制存儲示例

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

整數85內存存儲

4. 浮點數 IEEE 754 存儲結構

類型符號位指數位尾數位偏移量有效數字
float1823127~7 位十進制
double111521023~15 位十進制
long double (x87)1156416383~19 位十進制
規範化形式:值 = (-1)^符號 × 1.尾數 × 2^(指數-偏移)。隱含最高位 1 不存儲,實際精度分別為 24/53/65 位。

三、類型別名與簡寫規則

完整形式常用簡寫等價性
short intshort完全等價
long intlong完全等價
long long intlong long完全等價
unsigned intunsigned完全等價
unsigned short intunsigned short完全等價
unsigned long intunsigned long完全等價

四、常量與字面量

1. 字面常量分類

  • 整型字面量:12, 0, -3, 0xFF, 0b1010
  • 浮點字面量:4.6, -1.23, 3.14e-10
  • 字符字面量:'a', '\n', L'中', u8'中'
  • 字符串字面量:"hello", L"寬", R"(raw)"
  • 布爾字面量:true, false
  • 指針字面量:nullptr (C++11)

2. 用戶定義字面量 (C++11)

constexpr long double operator"" _km(long double d) { return d * 1000; }
auto len = 5.5_km;  // 5500.0 (long double)

五、類型選型決策樹

決策流程

  1. 是否需要小數? → 是 → double (默認) / float (內存敏感) / long double (高精度)
  2. 是否為整數? → 是 → 是否可能為負?
    • 否 → unsigned 系列 (uint32_t 等固定寬度類型)
    • 是 → 範圍多大?
      • ±3萬內 → short / int16_t
      • ±21億內 → int / int32_t (默認首選)
      • 更大 → long long / int64_t
  3. 固定寬度需求? → <cstdint> 提供 int8_t..int64_t, uint8_t..uint64_t
  4. 字符處理? → ASCII 用 char,Unicode 用 char8_t/char16_t/char32_t (C++20)

六、編譯器差異與移植性陷阱

類型Windows (MSVC, 64位)Linux/macOS (GCC/Clang, 64位)
long4 字節8 字節
long double8 字節 (同 double)16 字節 (80位擴展精度)
wchar_t2 字節 (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> 或鄰接矩陣
  • 棧/隊列:數組/鏈表實現 + 封裝接口

八、現代 C++ 類型推導與萃取

1. auto / decltype 自動推導

auto x = 42;        // int
auto y = 3.14;      // double
auto p = &x;        // int*
decltype(x) z = 0;  // int

2. 類型萃取 <type_traits>

static_assert(std::is_integral_v);
static_assert(std::is_floating_point_v);
static_assert(sizeof(int) == 4);  // 編譯期斷言

3. 概念與約束 (C++20)

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++ 代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved