Type | Type's size on x32 / x64 platform | Note |
---|---|---|
int | 32 / 32 | Basic type. On 64-bit systems remains 32-bit. |
long | 32 / 32 | Basic type. On 64-bit Windows systems remains 32-bit. Keep in mind that in 64-bit Linux systems this type was extended to 64-bit. Don't forget about it if you develop code which should be compiled for Windows and Linux systems. |
size_t | 32 / 64 | Basic unsigned type. The type's size is chosen in such a way that you could write the maximum size of a theoretically possible array into it. You can safely put a pointer into size_t type (except for pointers to class functions, but this is a special case). |
ptrdiff_t | 32 / 64 | Similar to size_t type but this is a signed type. The result of the expression where one pointer is subtracted from the other (ptr1-ptr2) will have ptrdiff_t type. |
Pointer | 32 / 64 | The size of the pointer directly depends on the platform's size. Be careful while converting pointers to other types. |
__int64 | 64 / 64 | Signed 64-bit type. |
DWORD | 32 / 32 | 32-bit unsigned type. In WinDef.h is defined as:typedef unsigned long DWORD; |
DWORDLONG | 64 / 64 | 64-bit unsigned type. In WinNT.h is defined as:typedef ULONGLONG DWORDLONG; |
DWORD_PTR | 32 / 64 | Unsigned type in which a pointer can be placed. In BaseTsd.h is defined as:typedef ULONG_PTR DWORD_PTR; |
DWORD32 | 32 / 32 | 32-bit unsigned type. In BaseTsd.h is defined as:typedef unsigned int DWORD32; |
DWORD64 | 64 / 64 | 64-bit unsigned type. In BaseTsd.h is defined as:typedef unsigned __int64 DWORD64; |
HALF_PTR | 16 / 32 | A half of a pointer. In Basetsd.h is defined as:#ifdef _WIN64 typedef int HALF_PTR;#else typedef short HALF_PTR;#endif |
INT_PTR | 32 / 64 | Signed type in which a pointer can be placed. In BaseTsd.h is defined as:#if defined(_WIN64) typedef __int64 INT_PTR; #else typedef int INT_PTR;#endif |
LONG | 32 / 32 | Signed type which remained 32-bit. That's why in many cases LONG_PTR now should be used. In WinNT.h is defined as:typedef long LONG; |
LONG_PTR | 32 / 64 | Signed type in which a pointer can be placed. In BaseTsd.h is defined as:#if defined(_WIN64) typedef __int64 LONG_PTR; #else typedef long LONG_PTR;#endif |
LPARAM | 32 / 64 | Parameter for sending messages. In WinNT.h is defined as:typedef LONG_PTR LPARAM; |
SIZE_T | 32 / 64 | Analog of size_t type. In BaseTsd.h is defined as:typedef ULONG_PTR SIZE_T; |
SSIZE_T | 32 / 64 | Analog of ptrdiff_t type. In BaseTsd.h is defined as:typedef LONG_PTR SSIZE_T; |
ULONG_PTR | 32 / 64 | Unsigned type in which a pointer can be placed. In BaseTsd.h is defined as:#if defined(_WIN64) typedef unsigned __int64 ULONG_PTR;#else typedef unsigned long ULONG_PTR;#endif |
WORD | 16 / 16 | Unsigned 16-bit type. In WinDef.h is defined as:typedef unsigned short WORD; |
WPARAM | 32 / 64 | Parameter for sending messages. In WinDef.h is defined as:typedef UINT_PTR WPARAM; |
中文版
类型 32位 64位
int 32 32
char 8 8
long 32 32
指针 32 64
例题:
64位操作系统,不同类型变量对应的字节数为:(红色的表示与32位系统不同之处)
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节
64位系统在内存管理方面遵循8字节对齐,原则:在8字节对齐的情况下,按8个字节为单位分配存储空间,如果不足,会自动补充,本次分配不足以存放下面的变量时,会重新分配空间。
structA{
unsigned int a; //对于开始连续的第一个8字节内存,a占4字节
char b[2]; //b[]占1*2字节,在a后的连续2字节内存放,还剩2个字节,
double c; //c占8字节,第一个8字节还剩2字节不足以存放c,自动补充该2字节。并同时开辟第二个8字节内存存放c
short d; //d占2字节,开辟第三个8字节,存放d。剩余的6个字节补齐。故总共开辟了8*3=24字节存放该数据结构
}