<limits.h>ANSI C 標準在 <limits.h> 定義了所有整數類型的極值宏,直接 #include 即可使用,無需手動計算。
| 宏名稱 | 含義 | 典型值(32位系統) |
|---|---|---|
CHAR_BIT | char 位數 | 8 |
CHAR_MAX / CHAR_MIN | char 有符號極值 | 127 / -128 |
SCHAR_MAX / SCHAR_MIN | signed char 極值 | 127 / -128 |
UCHAR_MAX | unsigned char 最大值 | 255 |
SHRT_MAX / SHRT_MIN | short 極值 | 32767 / -32768 |
USHRT_MAX | unsigned short 最大值 | 65535 |
INT_MAX / INT_MIN | int 極值 | 2147483647 / -2147483648 |
UINT_MAX | unsigned int 最大值 | 4294967295 |
LONG_MAX / LONG_MIN | long 極值 | 同 int 或 64位下更大 |
ULONG_MAX | unsigned long 最大值 | 同上 |
LLONG_MAX / LLONG_MIN (C99) | long long 極值 | 9223372036854775807 / -9223372036854775808 |
ULLONG_MAX (C99) | unsigned long long 最大值 | 18446744073709551615 |
#include <stdio.h>
#include <limits.h>
int main() {
printf("char: [%d, %d]\n", CHAR_MIN, CHAR_MAX);
printf("short: [%d, %d]\n", SHRT_MIN, SHRT_MAX);
printf("int: [%d, %d]\n", INT_MIN, INT_MAX);
printf("long: [%ld, %ld]\n", LONG_MIN, LONG_MAX);
printf("llong: [%lld, %lld]\n", LLONG_MIN, LLONG_MAX);
printf("uchar: [0, %u]\n", UCHAR_MAX);
printf("ushort: [0, %u]\n", USHRT_MAX);
printf("uint: [0, %u]\n", UINT_MAX);
printf("ulong: [0, %lu]\n", ULONG_MAX);
printf("ullong: [0, %llu]\n", ULLONG_MAX);
return 0;
}
現代機器均採用二補數表示有符號整數。對於 N 位類型:
[-2^(N-1), 2^(N-1)-1][0, 2^N-1]例:16 位有符號 short → [-32768, 32767];無符號 unsigned short → [0, 65535](即 0xFFFF)。
static_assert(INT_MAX == 2147483647, "int 必須 32 位");<inttypes.h> 的 PRId32、PRIu64 等宏,避免 %d/%lld 不匹配。int32_t、uint64_t(<stdint.h>),對應極值宏為 INT32_MAX 等。signed char / unsigned char,不要假設 char 是有符號。long 在 64 位 Linux/macOS 上是 64 位,Windows 上是 32 位,切勿假設大小。1 << 31 在 32 位有符號 int 上是未定義行為,用 1u << 31 或 INT32_C(1) << 31。善用 <limits.h> 和 <stdint.h>,讓類型範圍查詢變得標準、可移植、零成本。