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

C/C++ 整型資料型別與類型修飾符完整指南

     編輯:關於C語言

為什麼需要類型修飾符?

基本整型 int 在 C 標準中僅保證「至少 16 位元」,實際寬度隨編譯器/平台而異(16/32/64 位元)。為了精確控制資料範圍、記憶體佔用與可移植性,C 提供 short、long、signed、unsigned 四大修飾符,組合出豐富的整型家族。

標準整型家族一覽表 (C99/C11)

類型名稱別名最小位元寬度典型範圍 (補碼)格式字串
signed char8-128 ~ 127%hhd
unsigned char80 ~ 255%hhu
short / signed shortshort int16-32,768 ~ 32,767%hd
unsigned shortunsigned short int160 ~ 65,535%hu
int / signed int16-32,768 ~ 32,767 (16位) / -2^31 ~ 2^31-1 (32位)%d
unsigned intunsigned160 ~ 65,535 / 0 ~ 2^32-1%u
long / signed longlong int32-2^31 ~ 2^31-1%ld
unsigned long320 ~ 2^32-1%lu
long long / signed long long(C99)64-2^63 ~ 2^63-1%lld
unsigned long long(C99)640 ~ 2^64-1%llu

關鍵規則:寬度遞增保證

sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)

標準僅保證相對關係,不固定絕對大小。例如:

  • Windows 64 位:short=2, int=4, long=4, long long=8
  • Linux x86_64:short=2, int=4, long=8, long long=8
  • 嵌入式 16 位:short=2, int=2, long=4, long long=8

固定寬度型別:<stdint.h> / <cstdint>

跨平台專案**強烈建議**使用精確寬度型別:

int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t
int_leastN_t   // 至少 N 位,最快
int_fastN_t    // 至少 N 位,最快
intptr_t, uintptr_t  // 能容納指標的整型
intmax_t, uintmax_t  // 最大寬度整型

常數字面值後綴

進制前綴範例後綴 (型別)
八進制00755U (unsigned), L (long), LL (long long)
十六進制0x / 0X0xFF, 0Xdeadbeef同上,大小寫皆可
十進制無123, -456同上
二進制0b / 0B (C++14 / GNU 擴展)0b1010同上

無後綴時,編譯器按 int → long → long long 首個能容納的型別推導;帶 U 則走 unsigned 族系。

有號/無號混合運算陷阱


unsigned int u = 10;
int i = -5;
if (u + i > 0) ...  // i 隱式轉 unsigned,結果變巨大正數 → 條件永真

鐵律:避免有號/無號直接比較或運算;必要時顯式 static_cast 統一型別。

sizeof 運算元與對齊

  • sizeof(type) / sizeof expr 返回**位元組數** (1 byte = CHAR_BIT 位,通常 8)。
  • 結構體大小 ≥ 成員大小之和,受**對齊**影響(下文另文詳述)。
  • C99 引入 %zu 格式化 size_t。

實務建議清單

  1. 預設用 int 做迴圈計數、索引;需要明確範圍改用 int32_t/int64_t。
  2. 位元操作、硬體暇存器映射、網路協議必須用 uint32_t 等固定寬度無號型別。
  3. 容器大小、索引用 size_t(無號、與指標同寬)。
  4. 跨平台序列化/反序列化:統一用 int32_t/int64_t + 網路位元組序(htonl/ntohl)。
  5. 編譯器警告全開:-Wconversion -Wsign-compare -Wshorten-64-to-32 捕捉隱式縮窄/符號轉換。

總結

理解整型修飾符的組合規則、寬度保證與平台差異,是寫出可移植、無溢位、高效能 C/C++ 程式的基石。善用 <cstdint> 固定寬度型別,讓「在這裡編譯、到處執行」不再是口號。

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