C語言是廣泛用於嵌入式系統、系統程式設計等多種用途的程式語言。其中,「資料型別」與「大小」對程式的記憶體使用與效能有重大影響。特別是當在不同環境(32位元 / 64位元、Windows / Linux 等)執行程式時,資料型別的大小可能會改變,因此選擇正確的型別非常重要。 本篇文章將說明 C 語言的基本資料型別大小、環境差異、適當型別選擇的要點。進一步介紹 sizeof 運算子用法,以及固定寬度整數型別(stdint.h)的使用方式等實務資訊。藉此加深對 C 語言型別的理解,並能進行更有效率的程式設計。
2. C語言的基本資料型別與大小
2.1 整數型大小列表
資料型別
32 位元環境
64 位元環境
最小大小
char
1 位元組
1 位元組
1 位元組
short
2 位元組
2 位元組
2 位元組
int
4 位元組
4 位元組
2 位元組
long
4 位元組
8 位元組
4 位元組
long long
8 位元組
8 位元組
8 位元組
2.2 浮點型大小列表
資料型別
32 位元環境
64 位元環境
float
4 位元組
4 位元組
double
8 位元組
8 位元組
long double
8~16 位元組
16 位元組
3. 資料型大小的環境相依性
3.1 各作業系統與編譯器的大小差異
資料型別
Windows (LLP64)
Linux (LP64)
32 位元 環境
int
4 位元組
4 位元組
4 位元組
long
4 位元組
8 位元組
4 位元組
long long
8 位元組
8 位元組
8 位元組
4. sizeof 運算子確認資料型別的大小
4.1 sizeof 的基本
#include <stdio.h>
int main() {
printf("Size of int: %zu bytesn", sizeof(int));
printf("Size of double: %zu bytesn", sizeof(double));
return 0;
}
5. 固定寬度整數型(stdint.h 的使用)
#include <stdio.h>
#include <stdint.h>
int main() {
int8_t a = 100;
16_t b = 50000;
int32_t c = -123456;
uint64_t d = 1000000000ULL;
printf("Size of int8_t: %zu bytesn", sizeof(a));
printf("Size of uint16_t: %zu bytesn", sizeof(b));
printf("Size of int32_t: %zu bytesn", sizeof(c));
printf("Size of uint64_t: %zu bytesn", sizeof(d));
return 0;
}
6. 結構體的大小與對齊
6.1 結構體的記憶體布局
#include <stdio.h>
struct example {
char a;
int b;
double c;
};
int main() {
printf("Size of struct: %zu bytesn", sizeof(struct example));
return 0;
}
7. 適當的資料型別選擇方式
7.1 整數型別的選擇方式
資料型別
大小
範圍
int8_t
1B
-128 ~ 127
uint8_t
1B
0 ~ 255
int32_t
4B
約 -2.1B ~ 2.1B
uint32_t
4B
0 ~ 4.2B
8. FAQ(常見問題)
Q1: sizeof 的結果為 unsigned int 的原因是什麼?
A: 在 C 語言中,sizeof 的返回值是 size_t 型,屬於無符號整數型。由於不存在負的大小,因而被定義為安全的型別。