我可以依赖'sizeof'来确定我使用的是32位操作系统还是64位操作系统

时间:2015-11-06 16:50:56

标签: c++ c 32bit-64bit virtual-memory

假设我不确定如何检查我正在运行的操作系统。

所以我想确定使用下面的代码:

#include <limits.h>
...
size_t os_size = sizeof(void*) * CHAR_BIT;

我可以100%依赖它,还是有任何需要注意的警告?

例如:

我是否可以安装32位操作系统的编译器并在64位操作系统上正常工作?

由于

2 个答案:

答案 0 :(得分:8)

正如您已经提到的,您可以在64位操作系统上使用32位编译器。在Linux上有一个更有趣的案例叫做X32 ABI,其中应用程序是32位特殊情况,但支持本机64位寄存器,本机64位数学等等。

答案 1 :(得分:3)

理论上,你可以有一个C实现,char是32位,sizeof(char) = sizeof(int) = sizeof(long) = 1,可能是sizeof(long long) = 2; IIRC在Common Lisp中的一些实验性实现(或者仅仅是SBCL)正在做类似的事情。可悲的是,我忘记了细节。

在实践中,最好使用<stdint.h> int32_tint64_tintptr_tsizeof(intptr_t) = sizeof(void*)

所以答案是

您可以使用<limits.h>INT_MAX等...

您可以使用交叉编译器....(例如,在Linux x86-64桌面上编译32位ARM安卓平板电脑,并使用交叉GCC)。

您可能希望使用autoconf之类的内容。阅读GCC common predefined macros。也许你想要__LP64__

你可能在x86-64上有一个支持64位的Linux操作系统,但在chroot环境(或容器版本的docker)中运行,提供32位环境(32位libc,32位编译器等...)。这实际上很有用(例如,在64位Linux笔记本电脑上测试您的应用程序可以在32位上编译和执行)。参见例如schroot。并且大多数Linux x86-64系统都能够运行32位x86 ELF二进制文件(至少如果它们是静态链接的)。 BTW,在我的Linux / Debian / x86-64系统gcc -m32上生成32位目标文件和可执行文件,但gcc -m64gcc只有64位...

在POSIX系统上,要了解您的机器,请使用uname(2)。在Linux上,您甚至可以阅读和解析/proc/cpuinfo(以及/proc/下的其他一些文件,请参阅proc(5))。

我对Windows一无所知。如果你正在使用它,你应该试试Linux。