<inttypes.h> 是 C 标准库中的一个头文件,提供了一些宏和类型,用于处理整数类型的打印和扫描。它与 <stdint.h> 头文件紧密相关,主要用于处理固定宽度的整数类型,确保在不同平台和编译器之间处理整数的格式时,代码的一致性和可移植性。


📖 目录

  1. <inttypes.h> 简介
  2. 整数打印和扫描宏
  3. 格式化宏
  4. 使用实例
  5. 参考资料

1️⃣ <inttypes.h> 简介

<inttypes.h> 提供了一些宏,用于将整数类型格式化为字符串并从字符串中读取整数。它特别有助于处理不同宽度的整数类型(如 int32_tuint64_t)时保持代码的可移植性,避免因平台不同而出现的问题。

这些宏的使用可以确保打印和输入操作能够在所有平台上进行一致的格式化,特别是在涉及固定宽度整数类型时。


2️⃣ 整数打印和扫描宏

📌 整数打印宏

<inttypes.h> 提供了一些宏,用于正确格式化打印不同宽度的整数类型。这些宏为每种固定宽度的整数类型定义了对应的格式化字符串。

  • PRId8: 用于打印 int8_t 类型的整数。
  • PRId16: 用于打印 int16_t 类型的整数。
  • PRId32: 用于打印 int32_t 类型的整数。
  • PRId64: 用于打印 int64_t 类型的整数。
  • PRIu8: 用于打印 uint8_t 类型的整数。
  • PRIu16: 用于打印 uint16_t 类型的整数。
  • PRIu32: 用于打印 uint32_t 类型的整数。
  • PRIu64: 用于打印 uint64_t 类型的整数。

📌 整数扫描宏

  • SCNd8: 用于从输入中扫描 int8_t 类型的整数。
  • SCNd16: 用于从输入中扫描 int16_t 类型的整数。
  • SCNd32: 用于从输入中扫描 int32_t 类型的整数。
  • SCNd64: 用于从输入中扫描 int64_t 类型的整数。
  • SCNu8: 用于从输入中扫描 uint8_t 类型的整数。
  • SCNu16: 用于从输入中扫描 uint16_t 类型的整数。
  • SCNu32: 用于从输入中扫描 uint32_t 类型的整数。
  • SCNu64: 用于从输入中扫描 uint64_t 类型的整数。

这些宏确保了在使用 scanfprintf 进行整数输入输出时,不会因平台或编译器不同而产生格式化问题。


3️⃣ 格式化宏

<inttypes.h> 定义的格式化宏为整数类型的打印提供了平台无关的支持,特别是在使用固定宽度整数类型时。

📌 示例:格式化打印

假设需要打印一个 int32_t 类型的变量,可以使用 PRId32 宏:

#include <stdio.h>
#include <inttypes.h>

int main() {
    int32_t num = 12345;
    printf("The number is: %" PRId32 "\n", num);
    return 0;
}

输出

The number is: 12345

类似地,使用 PRIu64 打印一个 uint64_t 类型的变量:

#include <stdio.h>
#include <inttypes.h>

int main() {
    uint64_t large_num = 9876543210;
    printf("The large number is: %" PRIu64 "\n", large_num);
    return 0;
}

输出

The large number is: 9876543210

📌 示例:从输入扫描整数

使用 scanf 函数读取整数时,使用 <inttypes.h> 中的格式化宏来确保数据类型的正确解析。例如,使用 SCNd32 扫描一个 int32_t 类型的整数:

#include <stdio.h>
#include <inttypes.h>

int main() {
    int32_t num;
    printf("Enter a number: ");
    scanf("%" SCNd32, &num);
    printf("You entered: %" PRId32 "\n", num);
    return 0;
}

输入

Enter a number: 456

输出

You entered: 456


4️⃣ 使用实例

📌 示例:整数打印与扫描

#include <stdio.h>
#include <inttypes.h>

int main() {
    int32_t age = 25;
    uint64_t population = 7839000000;

    // 打印整数
    printf("Age: %" PRId32 "\n", age);
    printf("World population: %" PRIu64 "\n", population);

    // 从输入扫描整数
    printf("Enter a number: ");
    int32_t input;
    scanf("%" SCNd32, &input);
    printf("You entered: %" PRId32 "\n", input);

    return 0;
}

输出

Age: 25
World population: 7839000000
Enter a number: 100
You entered: 100


5️⃣ 参考资料

📖 C 标准库 – <inttypes.h> 官方文档
📖 GNU C Library – inttypes.h
📖 ISO C 标准(PDF)


📌 总结

<inttypes.h> 提供了一组宏,专门用于处理固定宽度整数类型的打印和扫描。通过这些宏,程序员可以确保在不同平台间对整数类型的输入输出格式进行一致的处理,尤其在处理 int32_tuint64_t 等类型时。它使得 C 语言的整数输入输出更加可移植、可靠,尤其适用于跨平台应用开发。