limits.h
<limits.h> 定义整数类型的实现相关限制:最大值、最小值等。这些常量是编写可移植整数代码的基础,避免假设 int 是 32 位或 char 是有符号的。
主要常量
#include <limits.h>
/* char */
CHAR_BIT; /* char 的位数:通常 8 */
CHAR_MIN; /* char 最小值:0 或 -128 */
CHAR_MAX; /* char 最大值:127 或 255 */
SCHAR_MIN; /* signed char 最小值:-128 */
SCHAR_MAX; /* signed char 最大值:127 */
UCHAR_MAX; /* unsigned char 最大值:255 */
/* short */
SHRT_MIN; /* -32768 */
SHRT_MAX; /* 32767 */
USHRT_MAX; /* 65535 */
/* int */
INT_MIN; /* -2147483648 */
INT_MAX; /* 2147483647 */
UINT_MAX; /* 4294967295 */
/* long */
LONG_MIN;
LONG_MAX;
ULONG_MAX;
/* long long (C99) */
LLONG_MIN;
LLONG_MAX;
ULLONG_MAX;
使用示例
范围检查:
#include <limits.h>
int safe_add(int a, int b)
{
if (a > 0 && b > INT_MAX - a) {
/* 溢出 */
return INT_MAX;
}
if (a < 0 && b < INT_MIN - a) {
/* 下溢 */
return INT_MIN;
}
return a + b;
}
可移植循环:
/* 错误:假设 char 有符号 */
for (char c = 0; c < 128; c++) { /* 如果 char 无符号,无限循环 */
}
/* 正确 */
for (int c = 0; c <= SCHAR_MAX; c++) {
}
与 stdint.h 对比
#include <stdint.h>
int32_t x; /* 明确 32 位 */
int64_t y; /* 明确 64 位 */
/* limits.h 对应 */
INT32_MAX;
INT64_MAX;
常见错误
假设 int 大小:
/* 错误:假设 int 是 32 位 */
int arr[1000000000]; /* 可能溢出 */
/* 正确 */
#include <stdint.h>
int32_t arr[1000]; /* 明确大小 */
char 符号假设:
char c = 200;
if (c > 0) { /* 如果 char 有符号,c 是 -56 */
}
/* 正确 */
unsigned char c = 200;
最佳实践
- 用
limits.h常量而非硬编码 - 需要精确大小时用
<stdint.h> - 不假设
int、long的具体大小 - 注意
char的符号性不确定 - 运算前检查溢出条件