本文详细对比了C++中常见数据类型在32位和64位系统下的内存占用情况,涵盖了标准类型(如int
、long
、double
等)和自定义类型(如UINT32
、INT64
等)。通过代码示例和表格数据,展示了不同编译环境(VS2010、VS2019、Linux)下各类型的大小差异,特别是size_t
、pointer
、long
等类型在32位和64位系统中的显著变化。文章为开发者提供了跨平台开发时类型选择的参考,帮助避免因类型大小不一致导致的问题。
C++ 类型大小 (32bit 与 64bit)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include <iostream>
int main() { std::cout << "---标准类型大小---" << std::endl; std::cout << "short size: " << sizeof(short) << std::endl; std::cout << "int size: " << sizeof(int) << std::endl; std::cout << "unsigned int size: " << sizeof(unsigned int) << std::endl; std::cout << "long size: " << sizeof(long) << std::endl; std::cout << "unsigned long size: " << sizeof(unsigned long) << std::endl; std::cout << "long long size: " << sizeof(long long) << std::endl; std::cout << "unsigned long long size: " << sizeof(unsigned long long) << std::endl; std::cout << "size_t size: " << sizeof(size_t) << std::endl; std::cout << "double size: " << sizeof(double) << std::endl; std::cout << "float size: " << sizeof(float) << std::endl; std::cout << "char size: " << sizeof(char) << std::endl; std::cout << "unsigned char size: " << sizeof(unsigned char) << std::endl; std::cout << "signed char size: " << sizeof(signed char) << std::endl; std::cout << "pointer size: " << sizeof(void*) << std::endl;
std::cout << std::endl; std::cout << "---自定义类型大小---" << std::endl; std::cout << "SHORT(short) size: " << sizeof(short) << std::endl; std::cout << "INT(int) size: " << sizeof(int) << std::endl; std::cout << "LONG(long) size: " << sizeof(long) << std::endl; std::cout << "UINT8(unsigned char) size: " << sizeof(unsigned char) << std::endl; std::cout << "UINT16(unsigned short) size: " << sizeof(unsigned short) << std::endl; std::cout << "UINT32(unsigned int) size: " << sizeof(unsigned int) << std::endl; std::cout << "UINT64(unsigned long long) size: " << sizeof(unsigned long long) << std::endl; std::cout << "INT8(char) size: " << sizeof(char) << std::endl; std::cout << "INT16(short) size: " << sizeof(short) << std::endl; std::cout << "INT32(int) size: " << sizeof(int) << std::endl; std::cout << "INT64(long long) size: " << sizeof(long long) << std::endl; std::cout << "FLOAT(float) size: " << sizeof(float) << std::endl; std::cout << "DOUBLE(double) size: " << sizeof(double) << std::endl; std::cout << "CHAR(char) size: " << sizeof(char) << std::endl; std::cout << "BOOL(int) size: " << sizeof(int) << std::endl; std::cout << "BYTE(unsigned char) size: " << sizeof(unsigned char) << std::endl; std::cout << "HANDLE(void*) size: " << sizeof(void*) << std::endl;
return 0; }
|
类型 |
VS2010 32bit |
VS2010 64bit |
VS2019 32bit |
VS2019 64bit |
Linux 32bit |
Linux 64bit |
备注 |
short |
2 |
2 |
2 |
2 |
|
2 |
|
int |
4 |
4 |
4 |
4 |
|
4 |
|
long |
4 |
4 |
4 |
4 |
|
8 |
不同 |
long long |
8 |
8 |
8 |
8 |
|
8 |
|
unsigned short |
2 |
2 |
2 |
2 |
|
2 |
|
unsigned int |
4 |
4 |
4 |
4 |
|
4 |
|
unsigned long |
4 |
4 |
4 |
4 |
|
8 |
不同 |
unsigned long long |
8 |
8 |
8 |
8 |
|
8 |
|
size_t |
4 |
8 |
4 |
8 |
|
8 |
不同 |
char |
1 |
1 |
1 |
1 |
|
1 |
|
signed char |
1 |
1 |
1 |
1 |
|
1 |
|
unsigned char |
1 |
1 |
1 |
1 |
|
1 |
|
float |
4 |
4 |
4 |
4 |
|
4 |
|
double |
8 |
8 |
8 |
8 |
|
8 |
|
pointer |
4 |
8 |
4 |
8 |
|
8 |
不同 |
SHORT(short) |
2 |
2 |
2 |
2 |
|
2 |
|
INT(int) |
4 |
4 |
4 |
4 |
|
4 |
|
LONG(long) |
4 |
4 |
4 |
4 |
|
8 |
不同 |
UINT8(unsigned char) |
1 |
1 |
1 |
1 |
|
1 |
|
UINT16(unsigned short) |
2 |
2 |
2 |
2 |
|
2 |
|
UINT32(unsigned int) |
4 |
4 |
4 |
4 |
|
4 |
|
UINT64(unsigned long long) |
8 |
8 |
8 |
8 |
|
8 |
|
INT8(char) |
1 |
1 |
1 |
1 |
|
1 |
|
INT16(short) |
2 |
2 |
2 |
2 |
|
2 |
|
INT32(int) |
4 |
4 |
4 |
4 |
|
4 |
|
INT64(long long) |
8 |
8 |
8 |
8 |
|
8 |
|
FLOAT(float) |
4 |
4 |
4 |
4 |
|
4 |
|
DOUBLE(double) |
8 |
8 |
8 |
8 |
|
8 |
|
CHAR(char) |
1 |
1 |
1 |
1 |
|
1 |
|
BOOL(int) |
4 |
4 |
4 |
4 |
|
4 |
|
BYTE(unsigned char) |
1 |
1 |
1 |
1 |
|
1 |
|
HANDLE(void*) |
4 |
8 |
4 |
8 |
|
8 |
不同 |
结论:
size_t
、pointer
、long
、unsigned long
、HANDLE
这三种类型在32bit
和64bit
的大小有差别。