在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。