假设我不确定如何检查我正在运行的操作系统。
所以我想确定使用下面的代码:
#include <limits.h>
...
size_t os_size = sizeof(void*) * CHAR_BIT;
我可以100%依赖它,还是有任何需要注意的警告?
例如:
我是否可以安装32位操作系统的编译器并在64位操作系统上正常工作?
由于
答案 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_t
,int64_t
和intptr_t
来sizeof(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 -m64
或gcc
只有64位...
在POSIX系统上,要了解您的机器,请使用uname(2)。在Linux上,您甚至可以阅读和解析/proc/cpuinfo
(以及/proc/
下的其他一些文件,请参阅proc(5))。
我对Windows一无所知。如果你正在使用它,你应该试试Linux。