C 固定宽度整数
固定宽度整数
在 C 语言中,int、short 和 long 类型的大小会因计算机和系统而异。例如,一个 int 在某些系统上可能占用 2 个字节,而在另一个系统上则可能占用 4 个字节。
为了确保程序在所有计算机上的行为一致,C 语言在 <stdint.h> 头文件中提供了 固定宽度整数类型。无论在哪台计算机上,这些类型始终具有相同的大小(位数)。
最常见的固定宽度类型有:
| 类型 | 尺寸 | 范围 | Printf 说明符 |
|---|---|---|---|
int8_t |
8 bits (1 byte) | -128 to 127 | %d |
uint8_t |
8 bits (1 byte) | 0 to 255 | %u |
int16_t |
16 bits (2 bytes) | -32,768 to 32,767 | %d |
uint16_t |
16 bits (2 bytes) | 0 to 65,535 | %u |
int32_t |
32 bits (4 bytes) | -2,147,483,648 to 2,147,483,647 | %d |
uint32_t |
32 bits (4 bytes) | 0 to 4,294,967,295 | %u |
int64_t |
64 bits (8 bytes) | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 | %lld |
uint64_t |
64 bits (8 bytes) | 0 to 18,446,744,073,709,551,615 | %llu |
字母 u 代表 无符号,这意味着该类型只能存储 非负值(0 及以上)。与有符号类型相比,这使得最大正值翻倍,但您失去了存储负数的能力。
使用定宽整数
示例
#include <stdio.h>
#include <stdint.h> // 需要用于固定宽度整数
int main() {
int8_t a = 100; // 8-bit integer
int16_t b = 30000; // 16-bit integer
int32_t c = 2000000; // 32-bit integer
int64_t d = 9000000000; // 64-bit integer
printf("%d
", a);
printf("%d
", b);
printf("%d
", c);
printf("%lld
", d); // use %lld for 64-bit
return 0;
}
何时使用等宽整数?
对于大多数日常程序来说,你不需要这些类型——普通的 int 通常就足够了。
但在以下情况下,等宽整数是必不可少的:
- 您正在编写嵌入式系统(用于小型设备,例如微控制器的程序)。
- 您正在处理文件格式,并且对文件大小的精确性要求很高。
- 您正在通过网络发送数据,并且需要在不同的机器上获得一致的结果。
实际应用示例
假设你要编写一个程序来显示设备的电池电量。由于电池百分比始终介于 0 到 100 之间,因此你不需要像 int 这样的大类型。你可以使用 uint8_t,它正好占用 1 个字节(8 位),可以存储 0 到 255 之间的值:
示例
#include <stdio.h>
#include <stdint.h>
int main() {
uint8_t battery = 87; // 电池电量百分比
printf("Battery level is %u out of 100
", battery);
return 0;
}
这里我们使用uint8_t来节省内存,它非常适合存储范围较小且定义明确的值,例如电池百分比。

