当前位置: 首页 > news >正文

C++11中 <cinttypes>的入门与精通

文章目录

    • 一、`<cinttypes>` 是什么
      • 1. 固定宽度的整数类型
      • 2. 整数操作函数
      • 3. 格式化输入输出宏
    • 二、深入理解 `<cinttypes>`
      • 1. 固定宽度整数类型的使用
      • 2. 整数操作函数的使用
      • 3. 格式化输入输出宏的使用
    • 三、实践和技巧
      • 1. 使用固定宽度整数类型的最佳实践
      • 2. 使用整数操作函数的最佳实践
      • 3. 使用格式化输入输出宏的最佳实践
    • 四、总结
    • 五、`<cinttypes>` 的主要功能总结
      • 1. 固定宽度整数类型
      • 2. 整数操作函数
      • 3. 格式化输入输出宏
        • 输出宏
        • 输入宏
    • 六、`<cinttypes>` 的使用流程

在 C++11 中, <cinttypes> 是一个非常重要的标准库头文件,它为处理整数类型提供了强大的支持。

一、<cinttypes> 是什么

<cinttypes> 头文件最初是 C 标准库中的 <inttypes.h>,在 C++11 中被引入。它提供了固定宽度的整数类型、整数操作函数以及用于格式化输入输出的宏。这些功能对于处理不同平台上的整数类型非常有帮助,尤其是在需要确保代码的可移植性时。

1. 固定宽度的整数类型

<cinttypes> 中,定义了一系列固定宽度的整数类型,这些类型在不同平台上具有相同的大小和范围。例如:

  • std::int8_t:8 位有符号整数
  • std::int16_t:16 位有符号整数
  • std::int32_t:32 位有符号整数
  • std::int64_t:64 位有符号整数

这些类型确保了在不同平台上,整数的大小和范围是一致的,从而提高了代码的可移植性。

2. 整数操作函数

<cinttypes> 提供了一些基本的整数操作函数,例如:

  • std::imaxabs:计算绝对值
  • std::imaxdiv:计算整数除法的商和余数

这些函数在处理整数时非常有用,尤其是在需要精确控制整数运算时。

3. 格式化输入输出宏

<cinttypes> 提供了一系列宏,用于格式化输入输出。这些宏可以与 std::fprintfstd::fscanf 等函数一起使用,确保在不同平台上正确地格式化整数类型。例如:

  • PRId32:用于输出 32 位有符号整数
  • PRIu64:用于输出 64 位无符号整数

这些宏使得在不同平台上格式化整数变得非常简单。

二、深入理解 <cinttypes>

1. 固定宽度整数类型的使用

固定宽度整数类型在处理跨平台问题时非常有用。例如,假设你需要在不同平台上存储和传输一个 32 位的整数,你可以使用 std::int32_t 来确保在所有平台上这个整数的大小和范围都是一致的。以下是一个简单的例子:

#include <cinttypes>
#include <iostream>int main() {std::int32_t num = 123456789;std::cout << "The number is: " << num << std::endl;return 0;
}

在这个例子中,std::int32_t 确保了 num 在所有平台上都是一个 32 位的整数。

2. 整数操作函数的使用

std::imaxabsstd::imaxdiv<cinttypes> 提供的两个非常有用的函数。std::imaxabs 用于计算绝对值,而 std::imaxdiv 用于计算整数除法的商和余数。以下是一个使用这些函数的例子:

#include <cinttypes>
#include <iostream>int main() {std::intmax_t num = -123456789;std::intmax_t abs_num = std::imaxabs(num);std::cout << "The absolute value is: " << abs_num << std::endl;std::intmax_t numer = 123456789;std::intmax_t denom = 10;std::imaxdiv_t div_result = std::imaxdiv(numer, denom);std::cout << "The quotient is: " << div_result.quot << std::endl;std::cout << "The remainder is: " << div_result.rem << std::endl;return 0;
}

在这个例子中,std::imaxabs 计算了 num 的绝对值,而 std::imaxdiv 计算了 numerdenom 的商和余数。

3. 格式化输入输出宏的使用

<cinttypes> 提供的格式化输入输出宏可以与 std::fprintfstd::fscanf 等函数一起使用。这些宏确保了在不同平台上正确地格式化整数类型。以下是一个使用这些宏的例子:

#include <cinttypes>
#include <cstdio>int main() {std::int32_t num = 123456789;std::printf("The number is: %" PRId32 "\n", num);std::int64_t big_num = 1234567890123456789;std::printf("The big number is: %" PRId64 "\n", big_num);return 0;
}

在这个例子中,PRId32PRId64 宏确保了 numbig_num 在不同平台上正确地格式化为 32 位和 64 位整数。

三、实践和技巧

1. 使用固定宽度整数类型的最佳实践

在使用固定宽度整数类型时,以下是一些最佳实践:

  • 明确需求:在选择整数类型时,明确你的需求。如果只需要 8 位整数,就使用 std::int8_t,而不是更大的类型。
  • 考虑可移植性:固定宽度整数类型的主要优势是可移植性。确保在所有目标平台上使用相同的类型。
  • 避免隐式类型转换:在使用固定宽度整数类型时,避免隐式类型转换。如果需要转换,显式地进行类型转换。

2. 使用整数操作函数的最佳实践

在使用整数操作函数时,以下是一些最佳实践:

  • 检查输入:在使用 std::imaxdiv 等函数时,确保输入的值是有效的。例如,避免除以零。
  • 使用常量表达式:在可能的情况下,使用常量表达式来提高性能。例如,std::imaxabsstd::imaxdiv 都可以作为常量表达式使用。

3. 使用格式化输入输出宏的最佳实践

在使用格式化输入输出宏时,以下是一些最佳实践:

  • 使用正确的宏:确保使用正确的宏来格式化整数类型。例如,使用 PRId32 来格式化 std::int32_t,使用 PRIu64 来格式化 std::uint64_t
  • 避免硬编码格式字符串:使用宏来避免硬编码格式字符串。这可以提高代码的可读性和可维护性。

四、总结

<cinttypes> 是 C++11 中一个非常重要的标准库头文件,它提供了固定宽度的整数类型、整数操作函数以及用于格式化输入输出的宏。通过使用这些功能,你可以确保代码的可移植性和正确性。在实际开发中,遵循最佳实践和高级技巧,可以让你更好地利用 <cinttypes>,提高代码的质量和性能。

五、<cinttypes> 的主要功能总结

1. 固定宽度整数类型

类型描述
std::int8_t8 位有符号整数
std::int16_t16 位有符号整数
std::int32_t32 位有符号整数
std::int64_t64 位有符号整数
std::uint8_t8 位无符号整数
std::uint16_t16 位无符号整数
std::uint32_t32 位无符号整数
std::uint64_t64 位无符号整数

2. 整数操作函数

函数描述
std::imaxabs计算绝对值
std::imaxdiv计算整数除法的商和余数

3. 格式化输入输出宏

输出宏
描述
PRId8格式化 8 位有符号整数
PRId16格式化 16 位有符号整数
PRId32格式化 32 位有符号整数
PRId64格式化 64 位有符号整数
PRIu8格式化 8 位无符号整数
PRIu16格式化 16 位无符号整数
PRIu32格式化 32 位无符号整数
PRIu64格式化 64 位无符号整数
输入宏
描述
SCNd8输入 8 位有符号整数
SCNd16输入 16 位有符号整数
SCNd32输入 32 位有符号整数
SCNd64输入 64 位有符号整数
SCNu8输入 8 位无符号整数
SCNu16输入 16 位无符号整数
SCNu32输入 32 位无符号整数
SCNu64输入 64 位无符号整数

六、<cinttypes> 的使用流程

开始
包含 头文件
选择固定宽度整数类型
使用整数操作函数
使用格式化输入输出宏
结束
http://www.lryc.cn/news/578373.html

相关文章:

  • CppCon 2018 学习:A New Take on Polymorphism
  • Redis——常用指令汇总指南(一)
  • Electron 沙箱模式深度解析:构建更安全的桌面应用
  • 笨方法学python-习题12
  • jQuery 安装使用教程
  • 【算法】动态规划 斐波那契类型: 740. 删除并获得点数
  • 设计模式之上下文对象设计模式
  • IntelliJ IDEA 2025- 下载安装教程图文版详细教程(附激活码)
  • 使用nlohmann/json.hpp实现json文件读写
  • SpringBoot全局异常详解
  • 【实时Linux实战系列】实时数据库与数据存储方案
  • 学习threejs,使用自定义GLSL 着色器,生成艺术作品
  • 使用Rust原生实现小波卡尔曼滤波算法
  • 408第三季part1 - 操作系统 - 基本分页
  • 算法赋能管理:工厂安全与效率双突破
  • 【仿muduo库实现并发服务器】Channel模块
  • 回转体航行器控制系统中深度控制与俯仰姿态控制的解耦策略
  • 基于springboot的养老院管理系统
  • C# Linq to XML 详解:强大的XML处理工具
  • (自用)Java学习-5.21(支付宝沙箱支付、Vue总结)
  • 插入排序解析
  • sqlmap学习笔记ing(1.Easy_SQLi(时间,表单注入))
  • Django打造智能Web机器人控制平台
  • HarmonyOS应用开发高级认证知识点梳理 (一) 布局与样式
  • 记本好书:矩阵力量:线性代数全彩图解+微课+Python编程
  • 深蓝海域承建某大型保险集团产险知识库升级项目
  • 主流零信任安全产品深度介绍
  • 11OAuth2
  • 从零到一搭建远程图像生成系统:Stable Diffusion 3.5+内网穿透技术深度实战
  • 【深度学习1】ModernBert学习