基礎類型:`int`, `char`, `float`, `double`。
修飾詞:`short`, `long`, `signed`, `unsigned`。
可組合 (順序通常不影響語義,慣例:`signed/unsigned` 在前)。
| 類型別名 | 完整聲明 | 最小位寬 | 典型 64 位系統 (LP64) | 格式字串 |
|---|---|---|---|---|
| `short` / `short int` | `signed short int` | 16 | 16 位 | `%hd` / `%hi` |
| `unsigned short` | `unsigned short int` | 16 | 16 位 | `%hu` |
| `int` / `signed` | `signed int` | 16 | 32 位 | `%d` / `%i` |
| `unsigned` / `unsigned int` | `unsigned int` | 16 | 32 位 | `%u` |
| `long` / `long int` | `signed long int` | 32 | 64 位 (Linux) / 32 位 (Windows) | `%ld` |
| `unsigned long` | `unsigned long int` | 32 | 64/32 位 | `%lu` |
| `long long` / `long long int` | `signed long long int` | 64 | 64 位 | `%lld` |
| `unsigned long long` | `unsigned long long int` | 64 | 64 位 | `%llu` |
關鍵差異:`long` 在 Windows 64 位 (LLP64) 為 32 位,Linux/macOS 64 位 (LP64) 為 64 位。**跨平台必須用 `
| 類型 | 說明 | 範圍 (典型 8 位) |
|---|---|---|
| `char` | 實現定義有號性 (ARM 通常無號, x86 通常有號) | -128~127 或 0~255 |
| `signed char` | 明確有號 8 位整數 | -128 ~ 127 |
| `unsigned char` | 明確無號 8 位整數 / 位元組類型 | 0 ~ 255 |
用途區分:文字用 `char`;數值/位運算/緩衝區用 `uint8_t` (`unsigned char`)。
| 類型 | 最小位寬 | IEEE 754 典型 | 精度 (十進制有效位) | 範圍約略 |
|---|---|---|---|---|
| `float` | 32 | binary32 (單精度) | ~6-7 位 | ±1.2e-38 ~ ±3.4e38 |
| `double` | 64 | binary64 (雙精度) | ~15-17 位 | ±2.3e-308 ~ ±1.7e308 |
| `long double` | ≥64 | x86: 80 位擴展精度 ARM64/Power: 128 位 quadruple MSVC: 同 double (64) | ~19-33 位 | 極大 |
注意:`long double` 精度與大小**高度依賴平台/ABI**。`printf` 格式為 `%Lf` / `%Le` / `%Lg`。
// 整數
SHRT_MIN, SHRT_MAX, USHRT_MAX
INT_MIN, INT_MAX, UINT_MAX
LONG_MIN, LONG_MAX, ULONG_MAX
LLONG_MIN, LLONG_MAX, ULLONG_MAX (C99)
// 浮點
FLT_MIN, FLT_MAX, FLT_DIG (精度位數)
DBL_MIN, DBL_MAX, DBL_DIG
LDBL_MIN, LDBL_MAX, LDBL_DIG
#include
#include
#include
int main() {
printf("=== 整數 ===\n");
printf("short: %d ~ %d (size %zu)\n", SHRT_MIN, SHRT_MAX, sizeof(short));
printf("int: %d ~ %d (size %zu)\n", INT_MIN, INT_MAX, sizeof(int));
printf("long: %ld ~ %ld (size %zu)\n", LONG_MIN, LONG_MAX, sizeof(long));
printf("long long: %lld ~ %lld (size %zu)\n", LLONG_MIN, LLONG_MAX, sizeof(long long));
printf("unsigned long long max: %llu\n", ULLONG_MAX);
printf("\n=== 字元 ===\n");
printf("char: %d ~ %d (signed? %d)\n", CHAR_MIN, CHAR_MAX, CHAR_MIN < 0);
printf("signed char: %d ~ %d\n", SCHAR_MIN, SCHAR_MAX);
printf("unsigned char: 0 ~ %u\n", UCHAR_MAX);
printf("\n=== 浮點 ===\n");
printf("float: %e ~ %e (digits %d, size %zu)\n", FLT_MIN, FLT_MAX, FLT_DIG, sizeof(float));
printf("double: %e ~ %e (digits %d, size %zu)\n", DBL_MIN, DBL_MAX, DBL_DIG, sizeof(double));
printf("long double: %Le ~ %Le (digits %d, size %zu)\n", LDBL_MIN, LDBL_MAX, LDBL_DIG, sizeof(long double));
return 0;
}