C语言入门系列:可迁移的数据类型

devtools/2024/9/23 4:49:48/

文章目录

    • 1,精确宽度类型(exact-width integer type)
    • 2,最小宽度类型(minimum width type)
    • 3,最快的最小宽度类型(fast minimum width type)
    • 4,可以保存指针的整数类型。
    • 5, 最大宽度整数类型,用于存放最大的整数。
    • 6,注意事项
    • 7,小结

C 语言的整数类型(short、int、long)是非常灵活的,C语言标准并没有规定整形的长度,在不同计算机上,占用的字节宽度可能是不一样的,例如,int在某些系统上可能是32位,在其他系统上可能是16位。

程序从一台计算机迁移到另一台计算机时,这种灵活性可能导致一迁移失败,比如从32位int计算机迁移到16位int计算机,在新的计算机上,程序可能出现溢出,进而导致异常。

为了解决这个问题,引入了一些可移植的类型定义,这些类型主要定义在stdint.h和inttypes.h这两个头文件中,它们是C99标准引入的。
在这里插入图片描述

1,精确宽度类型(exact-width integer type)

这个类型保证某个整数类型的宽度是确定的。

int8_t:8位有符号整数。
int16_t:16位有符号整数。
int32_t:32位有符号整数。
int64_t:64位有符号整数。
uint8_t:8位无符号整数。
uint16_t:16位无符号整数。
uint32_t:32位无符号整数。
uint64_t:64位无符号整数。

注意,上面这些本质上都是类型别名,C语言标准库并没有对应的真正的数据类型,实际上编译器会将它们指向的标准库的类型。

比如,某个系统中:

  • 如果int类型为32位,int32_t就会指向int。
  • 如果long类型为32位,int32_t则会指向long。

下面是一个使用示例。

#include <stdio.h>
#include <stdint.h>int main(void) {int32_t x32 = 45933945;printf("x32 = %d\n", x32);return 0;
}

上面示例中,变量x32声明为int32_t类型,可以保证是32位的宽度。

2,最小宽度类型(minimum width type)

顾名思义,使用这种类型可以保证数据在内存中占用的最小字节宽度。

int_least8_t
int_least16_t
int_least32_t
int_least64_t
uint_least8_t
uint_least16_t
uint_least32_t
uint_least64_t

上面这些类型,可以保证占据的字节不少于指定宽度。

比如,int_least8_t表示可以容纳8位有符号整数的最小宽度的类型。

3,最快的最小宽度类型(fast minimum width type)

可以使整数计算达到最快的类型。

int_fast8_t
int_fast16_t
int_fast32_t
int_fast64_t
uint_fast8_t
uint_fast16_t
uint_fast32_t
uint_fast64_t

上面这些类型是保证字节宽度的同时,追求最快的运算速度,比如int_fast8_t表示对于8位有符号整数,运算速度最快的类型。

这是因为某些机器对于特定宽度的数据,运算速度最快,举例来说,32位计算机对于32位数据的运算速度,会快于16位数据。

4,可以保存指针的整数类型。

intptr_t:可以存储指针(内存地址)的有符号整数类型。
uintptr_t:可以存储指针的无符号整数类型。

5, 最大宽度整数类型,用于存放最大的整数。

intmax_t:可以存储任何有效的有符号整数的类型。
uintmax_t:可以存放任何有效的无符号整数的类型。

上面的这两个类型的宽度比long long和unsigned long更大。

6,注意事项

使用了上述类型后,标准输出时可能出现异常。

inttypes.h还定义了与这些类型相对应的格式化宏,如PRId32用于打印int32_t类型的变量,确保打印函数的正确使用。在进行输入输出操作时,使用对应类型的格式化宏,避免类型不匹配导致的问题。

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>int main() {// 定义一个32位有符号整数int32_t myInt = 123456789;// 使用对应的格式化宏进行输出printf("My 32-bit integer: %" PRId32 "\n", myInt);// 定义一个无符号的16位整数uint16_t myUnsignedShort = 65535;// 输出无符号16位整数printf("My 16-bit unsigned integer: %" PRIu16 "\n", myUnsignedShort);return 0;
}

在这个示例中,我们定义了两个可移植类型的变量:一个32位有符号整数myInt和一个16位无符号整数myUnsignedShort。

使用PRId32和PRIu16宏来确保在打印这些变量时使用的格式是正确的,无论程序在何种平台上运行。

这样编写代码能最大程度地确保数据处理的一致性和程序的可移植性。

7,小结

使用这些类型时,可以确保程序中的变量在不同平台上具有一致的大小和行为,从而提高了程序的可移植性。

例如,如果你需要一个确切的32位整数,你应该使用int32_t而不是依赖于int,因为int的大小在不同平台和编译器上可能会有所不同。


http://www.ppmy.cn/devtools/53980.html

相关文章

学习新语言方法总结(二)

上一篇介绍了学习语言的数据类型、流程控制&#xff0c;leetcode上刷几道题目应该对基本代码逻辑有所了解了。这一篇主要来说一下进阶模块&#xff1a;面向对象 OOP思想是编程中重要的一个模块&#xff0c;在各个语言都有大量的广泛运用&#xff0c;废话不多说&#xff0c;直接…

【C++11 之强类型枚举enum class/struct 基本结构及应用场景】了解在enum基础上增加了什么

C11 中的强类型枚举&#xff08;也称为枚举类&#xff09;通过 enum class 或 enum struct 关键字来定义。它们的基本结构与传统枚举&#xff08;通过 enum 定义&#xff09;相似&#xff0c;但在类型安全性和作用域上有所不同。以下是强类型枚举的基本结构代码说明及解析&…

物联网LORA技术-SX1276/SX1277/SX1278-137MHz至1020MHz低功耗远距离收发器

概述&#xff1a; SX1276/SX1277/SX1278 收发器主要采用LORATM 远程调制解调器&#xff0c;用于超长距离扩频通信&#xff0c;抗干扰性强&#xff0c;能够最大限度降低电流消耗。借助升特的LoRaTM 专利调制技术&#xff0c;SX1276/SX1277/SX1278 采用低成本的晶体和物料即可获得…

Web Workers 与 DOM:异步处理与用户界面的和谐共存

在现代Web应用开发中&#xff0c;处理复杂的计算任务与维护流畅的用户界面体验是两大核心挑战。HTML5引入的Web Workers为解决这一难题提供了有效途径&#xff0c;它允许在后台线程执行脚本&#xff0c;从而避免了长时间运行的计算任务阻塞用户界面&#xff08;UI&#xff09;线…

【Qt基础教程】事件

文章目录 前言事件简介事件示例总结 前言 在开发复杂的图形用户界面(GUI)应用程序时&#xff0c;理解和掌握事件处理是至关重要的。Qt&#xff0c;作为一个强大的跨平台应用程序开发框架&#xff0c;提供了一套完整的事件处理系统。本教程旨在介绍Qt事件处理的基础知识&#x…

展厅装修时候需要注意哪些细节

1、视觉方面 展厅应该具有很强的视觉冲击力。只有这样不论是领导视察还是合作的客户进行参观的时候才会对展厅产生浓厚的兴趣&#xff0c;同时产生一种亲和力&#xff0c;并直接加深对企业的识别度和记忆度。而个性化设计要跟企业文化相符合。这里&#xff0c;企业标志为寻求个…

Python入门指南:从基础到高级

一、引言 1.1 Python编程语言简介 一、起源与发展 Python由荷兰计算机科学家吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;于1990年代初设计&#xff0c;作为ABC语言的一种替代品。 1991年发布了Python的第一个版本&#xff08;0.9.0&#xff09;。 2000年发布了Py…

高考志愿填报,如何权衡学校和专业?

高考是人生的分水岭&#xff0c;成绩好的学生能就读更好的大学&#xff0c;获得更多的学习资源&#xff0c;但也有一些同学即使凭借高分数进入了高校&#xff0c;专业的学习过程却不尽如人意&#xff0c;他们也没有将100%的精力投入到专业学习当中。 无论高考结束之后获得了多…