因为在许多 64 bits 机器(例如 x86-64)上,通用 GCC 编译器 sizeof(int)==4 但 sizeof(void*)==8 && sizeof(long)==8;这称为 I32LP64(或只是 LP64)data model
例如,在 Linux/x86-64 系统上编译并运行以下程序:
#include<stdio.h>
#include<stdint.h>
int main ()
{
printf ("sizeof(int)=%d\n", (int) sizeof (int));
printf ("sizeof(intptr_t)=%d\n", (int) sizeof (intptr_t));
printf ("sizeof(short)=%d\n", (int) sizeof (short));
printf ("sizeof(long)=%d\n", (int) sizeof (long));
printf ("sizeof(long long)=%d\n", (int) sizeof (long long));
printf ("sizeof(void*)=%d\n", (int) sizeof (void *));
return 0;
}
在使用gcc -Wall s.c -o s 在我的系统上编译并在我的Debian/Sid/x86-64(i3770k 处理器,GCC 4.8.2)上运行./s 之后:
sizeof(int)=4
sizeof(intptr_t)=8
sizeof(short)=2
sizeof(long)=8
sizeof(long long)=8
sizeof(void*)=8
使用gcc -m32 -Wall s.c -o s32在32位模式下编译并运行./s32后:
sizeof(int)=4
sizeof(intptr_t)=4
sizeof(short)=2
sizeof(long)=4
sizeof(long long)=8
sizeof(void*)=4
如果使用 gcc -mx32 -O3 -Wall s.c -o sx32 编译 x32,我将得到相同的输出!
顺便说一句,也许更好的问题是为什么不使用intptr_t .... 我不知道(可能是习惯问题;when Linus 首先开始编写他的内核,C99 标准定义@ 987654343@ 和 intptr_t- 还不存在)。
阅读有关ABIs 的更多信息,特别是仔细阅读X86-64 ABI(另请参阅x32 ABI...)和x86 calling conventions 上的维基页面。