在C/C++中涉及的整数相关的类型大致有如下几种:

  • char、unsigned char
  • short、unsigned short
  • int、unsigned int
  • long、unsigned long
  • long long、unsigned long long
  • int8_t、uint8_t
  • int32_t、uint32_t
  • int64_t、uint64_t
  • DWORD
  • DWORD32、DWORD64
  • size_t、ssize_t
  • SIZE_T、SSIZE_T

一、原生数据类型

以下数据类型C/C++语言中的原生整数类型,其长度取决于所使用的计算机系统和编译器:

  • short、unsigned short
  • int、unsigned int
  • long、unsigned long
  • long long、unsigned long long

如果需要开发跨平台的、具有良好可移植性的程序,请不要使用这些数据类型。通常情况下,这些数据类型所占字节数如下表所示:

数据类型 字节数 范围
char 1 -128 ~ 127
unsigned char 1 0 ~ 255
short 2 -32,768 ~ 32,767
unsigned short 2 0 ~ 65,535
int 4 -2,147,483,648 ~ 2,147,483,647
unsigned int 0 0 ~ 4,294,967,295
long 4 -2,147,483,648 ~ 2,147,483,647
unsigned long 4 0 ~ 4,294,967,295
long long 8 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
unsigned long long 8 0 ~ 18,446,744,073,709,551,615

二、int*_t数据类型

int*_t格式的数据类型是使用typedef重新定义的数据类型。通过在不同的编译环境进行重定义,确保其所占用的字节数始终相同(即数据范围也相同)。

适合用来开发跨平台的程序。

数据类型 字节数 范围
int8_t 1 -128 ~ 127
uint8_t 1 0 ~ 255
int32_t 4 -2,147,483,648 ~ 2,147,483,647
uint32_t 4 0 ~ 4,294,967,295
int64_t 8 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
uint64_t 8 0 ~ 18,446,744,073,709,551,615

三、size_t和std::size_t

size_t和std::size_t是不同的数据类型,size_t是定义在C语言的头文件,而std::size_t定义在C++标准库的<cstddef>头文件中。

虽然二者是不同的数据类型,但std::size_t在实现上兼容size_t了,二者所占的字节数始终相同。

size_t和std::size_t都是无符号整型,它们在32位编译环境占用4字节,64位编译环境占8字节。

如果需要使用有符号的size_t类型,在Linux上可以使用ssize_t类型,Windows上可以使用SSIZE_T类型。

四、DWORD和DWORD32、DWORD64

DWORD是32位无符号整型(范围0 ~ 4,294,967,295

DWORD32也是32位无符号整型(范围0 ~ 4,294,967,295),而DWORD64是64位无符号整型(范围0 ~ 18,446,744,073,709,551,615)。

DWORD为什么一直是32位无符号整型?

微软在设计之初是打算让DWORD在不同的编译环境具有不同位数的,但从目前情况来看,这种希望已然破灭,DWORD将永远是32位的无符号整型。

五、一点点建议

为了保证程序的可移植性,请在开发中只使用固定字节数的数据类型,如int8_t、int32_t、int64_t。