WORD_BIT 与 LONG_BIT

WORD_BIT 与 LONG_BIT

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_BITLONG_BITint分别为类型和的对象中的位数long。类型对象的大小void *是指向数据的指针的大小。

32位int和64位long以及指针是64位x86上Linux的标准模型;它被称为 LP64(请参阅 System V ABI 的 AMD64 扩展)。

这些尺寸之间不存在任何联系; C 提供的唯一大小相等保证是sizeof(char)1。例如,x64 上的 Windows 使用 32 位longint64 位指针。 (还有其他大小要求:C 保证sizeof(short)sizeof(int)sizeof(long)shortint至少为 16 位,并且long至少为 32 位;POSIX 还要求 和intlong长度至少为 32 位。)

就匹配操作系统和 CPU 而言,最重要的对象大小是指针大小(如何处理intlong是编译器主要关心的问题),但操作系统和 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 位longLinux 上为 64 位),甚至“本机”指针大小也可能不是您所期望的( Linuxx32 ABI和 SPARC,在用户空间中使用 32 位指针)。从历史上看,64 位 Alpha 平台上发布的 Windows 版本都是 32 位操作系统。


1 在某些环境中(据我所知,非 Unix),指向数据的指针并不总是与指向函数的指针大小相同。

² 具有适当的固件支持,直到 Intel 发布X86SCPU。

答案2

补充一下其他信息:短语“指针的大小”是不明确的。在里面x86 内存型号“Medium”和“Compact”模型,数据指针的大小和代码指针的大小不同。类型指void *的是指向数据的指针。

相关内容