C 语言 - 固定宽度整数
固定宽度整数
在 C 语言中,int、short 和 long 类型的大小可能因计算机和系统而异。例如,int 在一个系统上可能占 2 个字节,而在另一个系统上可能占 4 个字节。
为了使程序在任何地方的行为都一致,C 语言在 <stdint.h> 头文件中提供了固定宽度整数类型。无论您使用哪台计算机,这些类型始终具有相同的大小(位数)。
最常见的固定宽度类型有:
| 类型 | 大小 | 范围 | Printf 说明符 |
|---|---|---|---|
int8_t |
8 位 (1 字节) | -128 到 127 | %d |
uint8_t |
8 位 (1 字节) | 0 到 255 | %u |
int16_t |
16 位 (2 字节) | -32,768 到 32,767 | %d |
uint16_t |
16 位 (2 字节) | 0 到 65,535 | %u |
int32_t |
32 位 (4 字节) | -2,147,483,648 到 2,147,483,647 | %d |
uint32_t |
32 位 (4 字节) | 0 到 4,294,967,295 | %u |
int64_t |
64 位 (8 字节) | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | %lld |
uint64_t |
64 位 (8 字节) | 0 到 18,446,744,073,709,551,615 | %llu |
字母 u 代表无符号,意味着该类型只能存储非负值(0 及以上)。与有符号版本相比,这使最大正值加倍,但您失去了存储负数的能力。
使用固定宽度整数
实例
#include <stdio.h>
#include <stdint.h> // 需要包含以使用固定宽度整数
int main() {
int8_t a = 100; // 8 位整数
int16_t b = 30000; // 16 位整数
int32_t c = 2000000; // 32 位整数
int64_t d = 9000000000; // 64 位整数
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
printf("%lld\n", d); // 对 64 位整数使用 %lld
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\n", battery);
return 0;
}
在这里,我们通过使用 uint8_t 来节省内存,它非常适合存储像电池百分比这样范围小且定义明确的值。