#includeint main() { printf("char: %d\n", sizeof(char)); printf("unsigned char: %d\n", sizeof(unsigned char)); printf("short: %d\n", sizeof(short)); printf("unsigned short: %d\n", sizeof(unsigned short)); printf("int: %d\n", sizeof(int)); printf("unsigned int: %d\n", sizeof(unsigned int)); printf("long: %d\n", sizeof(long)); printf("unsigned long: %d\n", sizeof(unsigned long)); printf("long long: %d\n", sizeof(long long)); printf("float: %d\n", sizeof(float)); printf("double: %d\n", sizeof(double)); printf("void*: %d\n", sizeof(void*)); return 0; }
| 型別 | 大小 | 備註 |
|---|---|---|
| char / signed char / unsigned char | 1 byte | 最小寻址單位 |
| short / unsigned short | 2 bytes | 16 位 |
| int / unsigned int / signed int | 4 bytes | 32 位,ARM 標準整數 |
| long / unsigned long | 4 bytes | 與 int 相同(LP64 模型下 long=8,但 ARM Embedded 多為 LLP64/ILP32) |
| long long / unsigned long long | 8 bytes | 64 位 |
| float | 4 bytes | IEEE 754 single |
| double | 8 bytes | IEEE 754 double |
| void* / 指標 | 4 bytes | 32 位位址總線 |
| enum | 4 bytes | 編譯器視為 int |
int sz = sizeof(int); // 編譯期常量,零開銷
編譯後打開 Project → Options for Target → Output → Generate Map File。
搜尋 SYMBOL 區段:
00000036H SYMBOL DATA BYTE temp 00000037H SYMBOL DATA BYTE temp2
BYTE = 1 字節WORD = 2 字節DWORD = 4 字節#ifdef __ARM_SIZEOF_INT__ // 可用 __ARM_SIZEOF_INT__ 等預定義巨集 #endif
| 場景 | 推薦型別 | 頭檔 |
|---|---|---|
| 確切寬度 | int8_t, uint16_t, int32_t, uint64_t | |
| 最快型別 | int_fast8_t, uint_fast16_t... | |
| 指標大小整數 | intptr_t, uintptr_t | |
| 最大整數 | intmax_t, uintmax_t | |
| 尺寸型別 | size_t | |
| 差值型別 | ptrdiff_t |
int32_t 等非標準別名需自行 typedef 或包含 stdint.h(C99)。struct { unsigned a:3; } 大小取決於底層型別與對齊。#pragma pack(n) 影響結構體對齊,進而影響 sizeof 結果。long double、wchar_t 大小上可能不同,以實測為準。Keil MDK (ARM 32 位) 下 int/long/pointer 均為 4 字節,long long/double 為 8 字節。嵌入式開發務必使用 stdint.h 確切寬度型別,避免移植至 64 位平台(如 Linux ARM64)時型別大小變更導致邏輯錯誤。隨時用 sizeof 實測,比查表更可靠。