我可以依靠 'sizeof' 来确定我使用的是 32 位 OS 还是 64 位 OS

Can I rely on 'sizeof' in order to determine whether I'm using 32-bit OS or 64-bit OS

假设我不确定如何检查 OS 我 运行 在做什么。

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

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

我可以 100% 依赖它吗?或者有什么我需要注意的注意事项吗?

例如:

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

谢谢

没有

正如您已经提到的,您可以在 64 位 OS 上安装 32 位编译器。在 Linux 上还有更有趣的案例,称为 X32 ABI,其中应用程序是 32 位的特例,但支持本机 64 位寄存器、本机 64 位数学等。

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

在实践中,最好使用 <stdint.h> 给出 int32_tint64_t 和一个 intptr_t 这样 sizeof(intptr_t) = sizeof(void*).

所以答案是

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

您可以有一个交叉编译器....(例如,在 Linux x86-64 桌面上为 32 位 ARM android 平板电脑编译 GCC) .

您可能想要使用 autoconf. Read about GCC common predefined macros 之类的东西。也许你想要 __LP64__

你可能有一个 Linux OS 在 x86-64 上支持 64 位,但 运行 在 chroot-ed 环境(或容器 à la docker) 提供了一个 32 位环境(带有 32 位 libc、32 位编译器等)。这实际上很有用(例如,在 64 位 Linux 笔记本电脑上测试您的应用程序可以在 32 位上编译和执行)。参见例如schroot。大多数 Linux x86-64 系统都能够 运行 32 位 x86 ELF 二进制文件(至少如果它们是静态链接的)。顺便说一句,在我的 Linux/Debian/x86-64 系统上 gcc -m32 生成 32 位目标文件和可执行文件,但是 gcc -m64 或仅 gcc 给出 64 位 ...

在 POSIX 系统上,要了解您的机器,请使用 uname(2). On Linux, you can even read and parse /proc/cpuinfo (and some other files under /proc/, see proc(5))。

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