数据模型决定了C语言中基本数据类型与数据宽度的对应关系。我们常用的32位模型称为ILP32,而64位模型有三种:LP64、LLP64和ILP64。在64位模型中,指针一定是64位的,但是int和long的宽度则在不同的数据类型中有不同的定义。如下表:
datatype |
LP32 |
ILP32 |
LLP64 |
LP64 |
ILP64 |
char |
8 |
8 |
8 |
8 |
8 |
short |
16 |
16 |
16 |
16 |
16 |
int |
16 |
32 |
32 |
32 |
64 |
long |
32 |
32 |
32 |
64 |
64 |
long long |
64 |
64 |
64 |
64 |
64 |
pointer |
32 |
32 |
64 |
64 |
64 |
从前的DOS是应该是LP32;现在的Windows 32和Linux 32是ILP32;在即将流行的64bits世界,Windows x64 版采用的是LLP64模型,Linux64采用的是LP64模型,用gcc编译时可以指定-m32按照ILP32模型进行编译。
指针大小跟机器字长相关。为了兼容,在写C代码时,用int声明32bit整数,用long long声明64bit整数。
按照POSIX的规定,一个整型的正确格式化串为:
sign |
char |
short |
int |
long |
long long |
signed |
%hhd |
%hd |
%d |
%ld |
%lld |
unsigned |
%hhu |
%hu |
%u |
%lu |
%llu |