int 类型
int 是 C 语言最常用的整数类型,标准保证它至少为 16 位,在大多数现代平台上是 32 位(4 字节)。它是整数计算的"标配",也是整数字面量的默认类型。
基本用法
int age = 25;
int temperature = -10;
int count = 0;
printf("sizeof(int) = %zu\n", sizeof(int)); /* 通常是 4 */
int 的取值范围可以通过 <limits.h> 查询:
#include <limits.h>
printf("INT_MIN = %d\n", INT_MIN); /* -2147483648(32 位) */
printf("INT_MAX = %d\n", INT_MAX); /* 2147483647(32 位) */
32 位 int 能表示约 ±21 亿的整数,足以应对大多数日常计算。但如果处理更大的数值(如人口统计、天文计算),需要使用 long long。
整数常量
整数常量的类型由值的大小和后缀决定:
42 /* int */
3000000000 /* 如果超出 int 范围,是 unsigned int 或 long */
42U /* unsigned int */
42L /* long */
42UL /* unsigned long */
42LL /* long long(C99) */
42ULL /* unsigned long long */
没有后缀的小整数默认是 int。如果值超出 int 范围,编译器会依次尝试 unsigned int、long、unsigned long、long long、unsigned long long。
格式化输入输出
printf 和 scanf 对 int 使用 %d,对 unsigned int 使用 %u:
int n = 42;
unsigned int u = 4000000000U;
printf("%d\n", n); /* 42 */
printf("%u\n", u); /* 4000000000 */
scanf("%d", &n);
选择指南
| 场景 | 推荐类型 |
|---|---|
| 一般整数计算 | int |
| 明确需要 32 位 | int32_t(<stdint.h>) |
| 明确需要 64 位 | int64_t(<stdint.h>) |
| 计数器、索引(非负) | size_t 或 unsigned int |
| 位运算、标志位 | unsigned int |
#include <stdint.h>
int32_t exact_32bit; /* 保证 32 位,跨平台一致 */
uint16_t flags; /* 16 位无符号,适合位掩码 */
<stdint.h>(C99 新增)提供了定宽整数类型,在需要精确控制大小时(如网络协议、文件格式、硬件寄存器)是最佳选择。
常见错误
整数溢出:
int big = 2147483647;
big = big + 1; /* 溢出!未定义行为 */
printf("%d\n", big); /* 可能输出 -2147483648 */
无符号回绕:
unsigned int u = 0;
u = u - 1; /* 回绕到 UINT_MAX */
printf("%u\n", u); /* 输出 4294967295 */
无符号整数溢出是定义行为(回绕),但有符号整数溢出是未定义行为——后者更危险,因为编译器可能做出任何假设。
格式说明符不匹配:
unsigned int u = 4000000000U;
printf("%d\n", u); /* 错误:%d 对应 int,u 是 unsigned int */
printf("%u\n", u); /* 正确 */
有符号与无符号混合运算:
unsigned int u = 10;
int s = -5;
if (s < u)
printf("s < u\n"); /* 可能不会输出! */
/* -5 被转换为很大的无符号数 */