目录
一、数据模型
32位和64位系统的各种数据类型长度取决于该系统所用的数据模型。
32位系统使用ILP32、LP32字长模型,64位系统使用LP64、ILP64、LLP64字长模型。其中I代表int,L代表long,P代表pointer,LL代表long long。
举个例子,LP64代表long和pointer都是64位(8字节)。具体如下表:
Data Type | ILP32 | LP32 | ILP64 | LP64 | LLP64 |
宏定义 | _ | _ | _ | __LP64__ | __LLP64__ |
平台 | Win32 API / Unix 和 Unix 类的系统 (Linux,Mac OS X) | Win16 API | Unix 和 Unix 类的系统 (Linux,Mac OS X) | Win64 API | |
char | 8 | 8 | 8 | 8 | 8 |
short | 16 | 16 | 16 | 16 | 16 |
int | 32 | 32 | 64 | 32 | 32 |
long | 32 | 32 | 64 | 64 | 32 |
long long | 64 | 64 | 64 | 64 | 64 |
pointer | 32 | 32 | 64 | 64 | 64 |
另外,float都是4字节,double都是8字节。
二、规律总结
不管什么系统,pointer位数一定跟系统位数一致。
系统无关:char一定4位,short一定16位,long long一定64位。
64位系统int long 32位或64位都有可能。
三、现状
如今的64位类Unix平台:LP64,而64位windows:LLP64。
ILP64数据模型已经基本不使用了。
四、编程实践
1.加宏定义
2.用具体的int32_t不使用int,是个很好的习惯。