【问题标题】:write a C/C++ program to find if a machine is 32 bit or 64 bit编写一个 C/C++ 程序来查找机器是 32 位还是 64 位
【发布时间】:2011-10-18 10:44:11
【问题描述】:

我在网上搜索,找不到任何程序。
我找到了以下链接 size of machine 64 or 32 bitprocessing files in 64 bit machine but developing in 32 bit machine
现在很明显 sizeof(int*) 不是办法。因为它将根据用于编译的机器的体系结构返回 4/8。那么如何找到呢?
条件:不使用任何系统/操作系统/库调用。
其实是面试时问的问题。

【问题讨论】:

  • cout << "Are you using a 64-bit computer?" << endl; cin >> answer;
  • @Dennis cout 和 cin 是库调用。
  • 问题是如果你在 32 位模式下编译,同时运行 CPU 会将你视为 32 位进程。在不使用操作系统的情况下,我相信您所做的一切都会像在 32 位地址空间中一样,即使在 64 位系统上运行也是如此。
  • 这个问题确实缺乏实用价值。这在理论上是不可能的,但在实践中微不足道。
  • 我知道这不是 OP 所要求的,但我有一个问题 - 如果程序是单独编译的(在 32 位和 64 位系统上) - sizeof(pointer)接近工作?

标签: c++


【解决方案1】:

如果您设法从 sizeof(int*) 中找到不使用操作系统调用的任何方法,我会印象深刻。我认为您可能已经得到了和他们想要的一样好的答案:p

【讨论】:

  • 当您在答案中添加 CHAR_BIT 时。
【解决方案2】:

对于 C++,带有 64 位编译器的 64 位机器上的 int 应该是 64 位,对于 32 位机器也是如此,所以 sizeof(int*) 应该可以工作

【讨论】:

  • 你不能根据int 的大小来决定可以是任何东西(通常是 32 位或 64 位),但在所有已知的 64 位系统中指向对象的指针都是 64 位(除非它们以 32 位兼容模式运行)。
  • 如果你编译成 64 位可执行文件并运行,那么你已经知道了。
【解决方案3】:

32 位系统地址空间不能寻址超过 4GB 的内存。假设 64 位平台有这么多可用的免费(值得商榷),您可以尝试在单个块中分配超过 4 gig。这在 32 位系统上肯定会失败。

这只是一个想法,我可能会被否决并返回,但这只是一个建议:)

【讨论】:

  • 不错,但如果可用内存不足 4GB 怎么办?
  • @Griffin,然后他就完蛋了 :)
  • +1,虽然这可能会导致用户敲打他/她的计算机而机器没有响应:)
  • @Ziyao - 你不太可能得到想要的结果 :-) 大多数操作系统不会在分配请求时提交内存,它们只是进行保留,通常在可用地址范围耗尽之前很久就会失败。
  • 在 32 位系统中,用户态进程可以在用户空间分配 2GB 内存。一旦工作集超过限制,就会引发异常。即使物理内存不可用,操作系统也会使用虚拟内存来分配请求的页面。
【解决方案4】:

将程序编译为64位,试一下能否在目标机上执行?

【讨论】:

    【解决方案5】:

    32 位环境将 int、long 和指针设置为 32 位,并生成可在任何 i386 系统上运行的代码。

    64 位环境将 int 设置为 32 位,将 long 和指针设置为 64 位,并为 AMD 的 x86-64 架构生成代码。

    你可以使用

    #include <stdio.h>
    int main(){
            long z; printf("Long int size is %i bytes long!\n", sizeof(z)); return 0;
    }
    

    并在 gcc 中使用 -m32 和 -m64 进行编译。如果它是 64 位平台,程序将运行并且输出将是 8,否则程序将死亡。

    【讨论】:

    • Linux 上的 gcc 就是这样。如果你在 Windows 上运行,在任一模式下 long 仍然是 32 位。
    【解决方案6】:

    如何制作一个程序,它自己创建一个 simple.cpp 文件并尝试以两种方式编译它? :)

    【讨论】:

    • 如何在不进行系统调用的情况下编译它?
    【解决方案7】:

    内联汇编呢? :)

    这仅基于使用 CPUID 指令读取的信息。使用什么操作系统并不重要。

    #include <iostream>
    
    bool is64Bit()
    {
        int ExtendedFeatureFlags;
        asm ( "mov $0x80000001, %%eax; " // 0x80000001 gets Extended Feature Flags
                  "cpuid; "                 // Call CPUID instruction.
                  "mov %%edx, %0; "         // Copy EDX into first output variable.
                  :"=r"(ExtendedFeatureFlags)  // Output variable.
                  :                            // No input variables.
                  :"%eax","%ebx","%ecx","%edx" // Clobbered registers.
                );
        return ExtendedFeatureFlags & (1<<29);
        // If the 29th bit is on, the processor supports 64bit
        // extensions.
    }
    
    int main()
    {
        std::cout << "Is 64bit?: " << (is64Bit() ? "YES" : "NO") << std::endl;
        return 0;
    }
    

    【讨论】:

    • 问题要求 32 位或 64 位。但不能保证它是x86!所以内联汇编不是解决方案:-)
    【解决方案8】:

    如何在 POSIX 投诉系统上使用 uname 系统调用:http://linux.die.net/man/2/uname 所需信息将在机器字段中。

    【讨论】:

      【解决方案9】:
      #include <stdio.h>
      int main(void) {
      
        printf("\n The Processor in this machine is %lu Bit Machine", sizeof(void *));
      
        return 0;
      }
      

      【讨论】:

      • 这是编译时检查,不是运行时检查!
      猜你喜欢
      • 1970-01-01
      • 2011-01-24
      • 2017-09-13
      • 1970-01-01
      • 2011-10-25
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多