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

Keil MDK 編譯器資料型別大小完整對照表與查看方法

     編輯:關於C語言

實測環境

  • IDE:Keil MDK (ARM Compiler 5/6)
  • 目標:ARM Cortex-M 系列(32 位)

標準型別大小測試代碼

#include 
int 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 char1 byte最小寻址單位
short / unsigned short2 bytes16 位
int / unsigned int / signed int4 bytes32 位,ARM 標準整數
long / unsigned long4 bytes與 int 相同(LP64 模型下 long=8,但 ARM Embedded 多為 LLP64/ILP32)
long long / unsigned long long8 bytes64 位
float4 bytesIEEE 754 single
double8 bytesIEEE 754 double
void* / 指標4 bytes32 位位址總線
enum4 bytes編譯器視為 int

三種查看型別大小的方法

方法一:代碼中用 sizeof 運算符(最直觀)

int sz = sizeof(int); // 編譯期常量,零開銷

方法二:查看 .map / .m51 映射檔

編譯後打開 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 字節
  • 相鄰符號地址差 = 變數大小

方法三:編譯器預定義巨集(ARM Compiler 6 / Clang)

#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

Keil 專屬注意事項

  1. int32_t 等非標準別名需自行 typedef 或包含 stdint.h(C99)。
  2. 位元域 struct { unsigned a:3; } 大小取決於底層型別與對齊。
  3. #pragma pack(n) 影響結構體對齊,進而影響 sizeof 結果。
  4. ARM Compiler 6 (Clang) vs ARM Compiler 5 (armcc) 在 long double、wchar_t 大小上可能不同,以實測為準。

總結

Keil MDK (ARM 32 位) 下 int/long/pointer 均為 4 字節,long long/double 為 8 字節。嵌入式開發務必使用 stdint.h 確切寬度型別,避免移植至 64 位平台(如 Linux ARM64)時型別大小變更導致邏輯錯誤。隨時用 sizeof 實測,比查表更可靠。

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