【问题标题】:C code to determine the size of CPU without using sizeof不使用 sizeof 确定 CPU 大小的 C 代码
【发布时间】:2016-06-25 11:01:41
【问题描述】:

有没有办法不使用 sizeOf 运算符就知道 CPU 是 32 位还是 64 位?

可以为此编写任何其他代码吗?

【问题讨论】:

  • 你如何使用sizeOf (mind the case) 操作符?
  • 32 位或 64 位 CPU 是什么意思?什么东西?
  • 你应该给我们更多的细节,特别是:这是 Linux 还是 Windows?
  • 为什么你问吗?你不能简单地使用<stdint.h>然后int32_tint64_tintptr_t和很快?请编辑您的问题以改进它...(在 x86-64 Linux 系统上使用 gcc -m32 编译怎么样;x32 ABI 怎么样??

标签: c cpu-architecture


【解决方案1】:

在这个问题How to determine whether a given Linux is 32 bit or 64 bit?

要检查系统是32位还是64位内核,可以调用

system("getconf LONG_BIT")

并检查它的回报。如果它说 64 是 64 位内核,如果是 32 则是 32 位内核。

要检查cpu是否支持64位,你可以在文件/proc/cpuinfo中检查它是否有标志“lm”(长模式)

system("grep flags /proc/cpuinfo | grep -c lm")

如果返回值为 1,则存在 lm 标志(64 位),如果为 0,则不存在(32 位)

不过,这只是 linux。其他选项在开头链接的问题中。例如,其中包括检查limits.h

【讨论】:

    【解决方案2】:

    指针数学怎么样?取指针数组中两个元素的地址,判断它们是相隔 8 字节还是 4 字节。

    {
        char * pa[2];
        char * pa1 = (char *)&pa[1];
        char * pa0 = (char *)&pa[0];
        if (pa1 - pa0 > 4)
            /* 64 bit pointers */;
        else 
            /* ... */;
    }
    

    【讨论】:

    • 不是我的反对意见。代码完全依赖于机器。不能一概而论,不。您可以在 64 位机器上拥有 32 位指针。另请参阅“远指针”。您可以在 16 位机器上使用 32 位远指针。
    • 如果你想知道指针是否是 64 位的,你应该测试UINTPTR_T > 0xFFFFFFFFUL。请注意,Linux x32 ABI 在 64 位 CPU (amd64) 上运行,但使用 32 位指针。它仍然可以处理 64 位整数而无需带进位和类似的东西,并且具有高效的原子 64 位操作。
    • 您是说 UINTPTR_MAX 吗?
    • 好吧,请给我点个赞——这就是你在不实际使用 sizeof 的情况下做 sizeof 的方式。
    【解决方案3】:

    您的代码应该是为运行它的处理器构建的,所以它会在编译器指令中。 看看数学库是如何处理它的,然后去做。 对于不同的编译器来说是不同的,但是你不能用 C 代码普遍地做到这一点。 例如:所有平台都应支持 64 位值。他们如何处理它们将因编译器指令而异。

    【讨论】:

    • 使用 C99 是错误的。您可以使用 <stdint.h> 中的 int64_t 处理 64 位,并且代码将不依赖于指令...
    • @BasileStarynkevitch:我认为他的意思是 add 是否是单个机器指令,或者它是否需要 add / adc,或者在目标 CPU 上调用任何 add-with-carry。不过,在二读时,这个答案似乎确实表明您可能需要不同的源代码。正如你所说,C99 并非如此。
    猜你喜欢
    • 1970-01-01
    • 2019-10-02
    • 2014-12-19
    • 2020-02-03
    • 2015-03-18
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多