Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我能依靠';尺寸';以确定I';我使用32位操作系统或64位操作系统_C++_C_32bit 64bit_Virtual Memory - Fatal编程技术网

C++ 我能依靠';尺寸';以确定I';我使用32位操作系统或64位操作系统

C++ 我能依靠';尺寸';以确定I';我使用32位操作系统或64位操作系统,c++,c,32bit-64bit,virtual-memory,C++,C,32bit 64bit,Virtual Memory,假设我不确定如何检查正在运行的操作系统 因此,我想使用以下代码确定: #include <limits.h> ... size_t os_size = sizeof(void*) * CHAR_BIT; #包括 ... size\u t os\u size=sizeof(void*)*CHAR\u位; 我可以100%依赖它吗?或者有什么需要注意的注意事项吗 例如: 我是否可能安装了32位操作系统的编译器,并且可以在64位操作系统上正常工作 谢谢没有。 正如您已经提到的,您可以在6

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

因此,我想使用以下代码确定:

#include <limits.h>
...
size_t os_size = sizeof(void*) * CHAR_BIT;
#包括
...
size\u t os\u size=sizeof(void*)*CHAR\u位;
我可以100%依赖它吗?或者有什么需要注意的注意事项吗

例如:

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

谢谢

没有。

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

否。


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

理论上,您可以使用C实现,其中
char
为32位,而
sizeof(char)
=
sizeof(int)
=
sizeof(long)
=1,并且可能
sizeof(long-long)
=2;IIRC在公共Lisp中的一些C的实验实现(或者可能只是SBCL)也在做类似的事情。遗憾的是,我忘记了细节

在实践中,最好使用
给出
int32\u t
int64\u t
intptr\u t
,以便
sizeof(intptr\t)
=
sizeof(void*)

所以答案是否定的

您可以使用
INT\u MAX

你可以有一个交叉编译器。。。。(例如,在Linux x86-64桌面上编译32位ARM安卓平板电脑,并带有十字)

您可能需要使用以下内容。了解。也许您想要
\uuu LP64\uuuu

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

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


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

理论上,您可以使用C实现,其中
char
为32位,
sizeof(char)
=
sizeof(int)
=
sizeof(long)
=1,可能
sizeof(long)
=2;IIRC在公共Lisp中的一些C的实验实现(或者可能只是SBCL)也在做类似的事情。遗憾的是,我忘记了细节

在实践中,最好使用
给出
int32\u t
int64\u t
intptr\u t
,以便
sizeof(intptr\t)
=
sizeof(void*)

所以答案是否定的

您可以使用
INT\u MAX

你可以有一个交叉编译器。。。。(例如,在Linux x86-64桌面上编译32位ARM安卓平板电脑,并带有十字)

您可能需要使用以下内容。了解。也许您想要
\uuu LP64\uuuu

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

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


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

在任何情况下,它都可能只知道编译器的目标是什么,这与它实际运行的目标无关。@harold:所以指针的大小只是指示我的编译器(而不是我的操作系统)支持的虚拟内存大小闻起来像XY问题。结果值(假设是准确的)将如何使用?@SergeyA,因为OP想知道他现在使用的是什么操作系统,如果操作系统支持在多个内存模型中运行进程,这将有什么帮助?编写一个程序来解决这个问题只会告诉你程序是如何编译的。在任何情况下,它的可能副本都可能只知道编译器的目标,而这与它实际运行的目标无关。@harold:所以指针的大小只指示我的编译器支持的虚拟内存的大小(而不是我的操作系统)?闻起来像XY问题。结果值如何(假设它是准确的)是否将被使用?@SergeyA,因为OP想知道他现在使用的是什么操作系统,如果操作系统支持在多个内存模型中运行进程,这会有什么帮助?编写一个程序来解决这个问题只会告诉你程序是如何编译的。好的,知道了,谢谢。我将等待你的answe的更多评论/答案/投票r为了确定,谢谢