WORD_BIT
和 和有什么区别LONG_BIT
?我应该使用哪一个来找出我的系统的字大小?两者返回不同的结果
➜ ~ getconf LONG_BIT
64
➜ ~ getconf WORD_BIT
32
➜ ~
我还在其他一些文章中读到,找出字大小的可靠方法是打印 void 的大小。这给了我 8 个字节。
printf("%d\n", (int)sizeof(void*));
这总是等于返回的结果吗getconf LONG_BIT
?
抱歉,这里再偷偷提一个问题——字长与CPU架构有关。操作系统是否也可以在 CPU 架构定义的相同字长上运行?
答案1
POSIX 定义WORD_BIT
和LONG_BIT
int
分别为类型和的对象中的位数long
。类型对象的大小void *
是指向数据的指针的大小。
32位int
和64位long
以及指针是64位x86上Linux的标准模型;它被称为 LP64(请参阅 System V ABI 的 AMD64 扩展)。
这些尺寸之间不存在任何联系; C 提供的唯一大小相等保证是sizeof(char)
1。例如,x64 上的 Windows 使用 32 位long
和int
64 位指针。 (还有其他大小要求:C 保证sizeof(short)
≤ sizeof(int)
≤ sizeof(long)
、short
和int
至少为 16 位,并且long
至少为 32 位;POSIX 还要求 和int
的long
长度至少为 32 位。)
就匹配操作系统和 CPU 而言,最重要的对象大小是指针大小(如何处理int
和long
是编译器主要关心的问题),但操作系统和 CPU 指针大小之间的关系也不总是简单的。操作系统必须使用指针大小支持的由 CPU 决定,但 CPU 可以支持多种指针大小...例如,64 位 x86 CPU² 可以运行 64 位操作系统(Windows x64、64 位 Linux 等)、32 位操作系统(Windows x32 、32位Linux、OS/2等)和16位操作系统(如MS-DOS)。即使在 64 位操作系统中,也可能存在差异,如上所述(Windows x64 上为 32 位long
,64 位long
Linux 上为 64 位),甚至“本机”指针大小也可能不是您所期望的( Linuxx32 ABI和 SPARC,在用户空间中使用 32 位指针)。从历史上看,64 位 Alpha 平台上发布的 Windows 版本都是 32 位操作系统。
1 在某些环境中(据我所知,非 Unix),指向数据的指针并不总是与指向函数的指针大小相同。
² 具有适当的固件支持,直到 Intel 发布X86SCPU。
答案2
补充一下其他信息:短语“指针的大小”是不明确的。在里面x86 内存型号“Medium”和“Compact”模型,数据指针的大小和代码指针的大小不同。类型指void *
的是指向数据的指针。