QT C++开发之:重定义基础数据类型

news/2024/12/2 16:40:50/

(1)前言

对于C/C++,几乎每个系统都会重定义(typedef)基础数据类型。
(QT在qglobal.h中,MSVS在minwindef.h)。
其目的是为了方便代码的迁移(在各种环境之间)。
另外,也是为了掌控数据类型的容量,不至于溢出了还不知道。

(2)环境

Qt 5.15 LTS,编译工具 MSVS / MinGW,CPU架构 32 / 64 bits。

(3)基础数据类型定义

以下是基础数据类型重定义的片段:

//(1.1) 无符号类型(按简写)
typedef unsigned char       uchar;      //char
typedef unsigned short      ushort;     //short
typedef unsigned int        uint;       //int
typedef unsigned long       ulong;      //long
typedef unsigned long long  ulonglong;  //long long//(1.2) 无符号类型(按所占位数)
typedef uchar       uint8;      //8bits
typedef ushort      uint16;     //16bits
typedef ulong       uint32;     //32bits
typedef ulonglong   uint64;     //64bits//(1.3) 无符号类型(按名称)
typedef uint8       BYTE;
typedef uint16      WORD;
typedef uint32      DWORD;      //Dual-word, 32 bits
typedef uint64      QWORD;      //Quad-word, 64 bits//(2.1) 有符号类型(按简写)
//typedef signed int        int;        //int
typedef signed long long    longlong;   //long long//(2.2) 有符号类型(按所占位数)
typedef signed char     int8;   //8bits
typedef signed short    int16;  //16bits
typedef signed long     int32;  //32bits
typedef longlong        int64;  //64bits

其中可以看出一些迷惑:无处安放的 int 和 万金油 long。
例如:uint32 用的是 ulong 而不是 uint,int32 用的是 long 而不是 int

(3.1)定义的依据

实际上,定义的依据无非有以下几点:

  • C++标准、惯用法(例如:DWORD 只能是32 bits,而不能用64 bits)
  • 主流环境(OS/CPU/编译器,例如:无需考虑 16 bits 环境)
  • 应用考量(宁大勿小防溢出,例如:能用 long 不用 int,能用 int64 不用 int32)

(3.2)定义的验证

以下是在 MSVS/MinGW,32/64 bits,debug/release 模式下运行输出结果:

Size(bits) of uchar/uint8/BYTE =  8
Size(bits) of ushort/uint16/WORD =  16
Size(bits) of unsigned int =  32
Size(bits) of ulong/uint32/DWORD =  32
Size(bits) of ulonglong/uint64/QWORD =  64
Size(bits) of char/int8 =  8
Size(bits) of short/int16 =  16
Size(bits) of signed int =  32
Size(bits) of int =  32
Size(bits) of long/int32 =  32
Size(bits) of longlong/int64 =  64

基本符合预期。

(4)结语

重定义基础数据类型是一个老话题。
但也也暗藏玄机,知其然(WHAT)和知其所以然(WHY)还是很有必要的。
GOOD LUCK!


http://www.ppmy.cn/news/58330.html

相关文章

「蓝桥杯」扫地机器人

扫地机器人 题目描述 小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所示。 走廊内部署了 K 台扫地机器人,其中第 i 台在第 A_i 个方格区域中。已知扫地机器人每分钟可以移动到左右相邻的方格中,并将该区域清扫干…

浅聊一下cmake

浅聊一下cmake 什么是cmake CMake是一个跨平台的编译工具,可以用简单的语句来描述所有平台的编译过程。 只要生成一份CMakeLists.txt文档,就可以利用CMake进行工程的搭建,能够输出各种各样的makefile或者project文件。 什么是makefile makefile定义…

Docker部署spring boot项目

在docker部署时首先要保证一般部署能够访问。 docker命令部署spring boot项目 目前主流的java框架为spring,软件包为jar包,只需以jar为基础构建容器环境。打包为jar后只需要jvm就可以运行,因此需要以jdk为镜像构建容器。 基于命令构建jdk环…

[C++基础]-类和对象(下)

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、深入学…

C++三大特性—继承“名字搜索与默认成员函数”

继承中的类的作用域 每个类定义自己的作用域,在这个作用域中定义自己的成员。当存在继承关系时,派生类的作用域嵌套在基类的作用域之中。如果一个名字在派生类的作用域中无法解析,那么编译器将继续在外层的基类中寻找该名字的定义。 继承关系…

运维——ssh无法登录云服务器

0x00 概述 一般来讲,无法登录ssh的原因挺多,如果无法登录云服务器,则除了要检查ssh端口是否放行,防火墙状态外,还需要检查云服务器web控制台入站规则是否开放了对应端口。如果你前面检查都是正常,那么还需…

你的个人AI助理Pi来了

还记得之前的文章《不要老盯着ChatGPT,这几家公司的产品同样不容小觑》提到的Inflection AI公司吗?通过其官方推文了解到,前期我们关注的个人AI助理有了新的进展,Pi开始对外发布。 Pi是什么 Pi 是一种 AI,一种旨在提供…

数据库之约束、索引和事务

一、约束 约束,顾名思义就是数据库对数据库中的数据所给出的一组检验规则.负责判断元素是否符合数据库要求.其目的就是为了提高效率以及准确性. 1.not null - > 数据元素非空 表示如果插入数据,则当前数据不能为空. //创建一张学生表,其班级id和年级id不为空 create …