C 语言 - 固定宽度整数

固定宽度整数

在 C 语言中,intshortlong 类型的大小可能因计算机和系统而异。例如,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 来节省内存,它非常适合存储像电池百分比这样范围小且定义明确的值。