(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!