【问题标题】:How can I discover whether my CPU is 32 or 64 bits?如何确定我的 CPU 是 32 位还是 64 位?
【发布时间】:2023-11-03 13:02:01
【问题描述】:

如何确定我的处理器是 32 位还是 64 位(使用您选择的语言)?我想知道 Intel 和 AMD 处理器的这一点。

【问题讨论】:

  • 您必须至少提供您试图在其中查找此信息的语言
  • 这看起来不像是一个编程问题。
  • 不,不是编程问题。应该关闭
  • 由于最佳答案实际上是与编程相关的答案,我想我会借此机会更明确地提出问题(并投票重新开放)。这个答案很容易知道。
  • 我也想打开它。这其实挺有意思的!

标签: language-agnostic processor


【解决方案1】:

VBScript,Windows:

Const PROCESSOR_ARCHITECTURE_X86 = 0
Const PROCESSOR_ARCHITECTURE_IA64 = 6
Const PROCESSOR_ARCHITECTURE_X64 = 9

strComputer = "."

Set oWMIService = GetObject("winmgmts:" & _
    "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colProcessors = oWMIService.ExecQuery("SELECT * FROM Win32_Processor")

For Each oProcessor In colProcessors
  Select Case oProcessor.Architecture
    Case PROCESSOR_ARCHITECTURE_X86
      ' 32-bit
    Case PROCESSOR_ARCHITECTURE_X64, PROCESSOR_ARCHITECTURE_IA64
      ' 64-bit
    Case Else
      ' other
  End Select
Next

Windows Script Host 的另一种可能的解决方案,这次是在 JScript 中并使用 PROCESSOR_ARCHITECTURE 环境变量:

var oShell = WScript.CreateObject("WScript.Shell");
var oEnv = oShell.Environment("System");
switch (oEnv("PROCESSOR_ARCHITECTURE").toLowerCase())
{
  case "x86":
    // 32-bit
  case "amd64":
    // 64-bit
  default:
    // other
}

【讨论】:

    【解决方案2】:

    Windows、C/C++:

    #include <windows.h>
    
    SYSTEM_INFO sysInfo, *lpInfo;
    lpInfo = &sysInfo;
    ::GetSystemInfo(lpInfo);
    switch (lpInfo->wProcessorArchitecture) {
    case PROCESSOR_ARCHITECTURE_AMD64:
    case PROCESSOR_ARCHITECTURE_IA64:
        // 64 bit
        break;
    case PROCESSOR_ARCHITECTURE_INTEL:
        // 32 bit
        break;
    case PROCESSOR_ARCHITECTURE_UNKNOWN:
    default:
        // something else
        break;
    }
    

    【讨论】:

    • 你能指定这是哪种语言(是的,知道但其他人可能不知道)以及任何其他要求(例如,头文件)吗?
    • 或者,就此而言,什么操作系统?这适用于我的 Mac Mini、我的 Linux 机器以及我的 Windows XP 和 Vista 系统吗?
    • 呸 - 无法编辑...但是需要将'default:'添加到该开关... :-)
    【解决方案3】:

    在 linux 中,您可以通过阅读来确定“位数”

    /proc/cpuinfo
    

    例如。

    cat /proc/cpuinfo | grep flags
    

    如果它包含

    lm
    

    标记它是 x86 64 位 CPU(即使您安装了 32 位 linux)

    不确定这是否适用于非 x86 CPU,例如 PPC 或 ARM。

    【讨论】:

      【解决方案4】:

      在 Python 中:

      In [10]: import platform
      In [11]: platform.architecture()
      Out[11]: ('32bit', 'ELF')
      

      像往常一样,非常整洁。但我很确定这些函数会返回构建 exec 的平台,而不是它运行的平台。某些极客在 64 位计算机上运行 32 位版本的可能性仍然很小。

      您可以获取更多信息,例如:

      In [13]: platform.system()
      Out[13]: 'Linux'
      
      In [19]: platform.uname()
      Out[19]: 
      ('Linux',
       'asus-u6',
       '2.6.28-11-generic',
       '#42-Ubuntu SMP Fri Apr 17 01:57:59 UTC 2009',
       'i686',
       '')
      

      等。

      这看起来更像是实时数据:-)

      【讨论】:

      • 我就是那个极客。存在 64 位 python,但很难获得该架构的预构建模块,并且几乎同样难以获得在本地编译的工作模块。
      【解决方案5】:

      在 .NET 中,您可以通过查看 IntPtr 结构的 Size 属性来区分 x86 和 x64。 IntPtr.Size 属性以字节为单位返回,每个字节 8 位,因此它在 32 位 CPU 上等于 4,在 64 位 CPU 上等于 8。由于我们谈论的是 32 位和 64 位处理器,而不是 4 字节或 8 字节处理器,所以我喜欢以位进行比较,这样可以更清楚地了解发生了什么。

      C#

      if( IntPtr.Size * 8 == 64 )
      {
          //x64 code
      }
      

      PowerShell

      if( [IntPtr]::Size * 8 -eq 64 )
      {
          #x64 code 
      }
      

      【讨论】:

        【解决方案6】:

        C#代码:

        int size = Marshal.SizeOf(typeof(IntPtr));
        if (size == 8)
        {
         Text = "64 bit";
        }
        else if (size == 4)
        {
         Text = "32 bit";
        }
        

        【讨论】:

          【解决方案7】:

          这里的棘手之处在于您可能有一个 64 位 CPU,但一个 32 位操作系统。如果您关心这种情况,它将需要一个 asm 存根来询问 CPU。如果没有,您可以轻松询问操作系统。

          【讨论】:

            【解决方案8】:

            C#,与操作系统无关

            sizeof(IntPtr) == 4 ? "32-bit" : "64-bit"
            

            这有点粗略,但基本上可以告诉您 CLR 是以 32 位还是 64 位运行的,这很可能是您需要知道的。例如,CLR 可以在 64 位处理器上作为 32 位运行。

            欲了解更多信息,请参阅此处:How to detect Windows 64-bit platform with .NET?

            【讨论】:

              【解决方案9】:

              我在想,在 64 位处理器上,指针是 64 位的。因此,与其检查处理器功能,不如使用指针以编程方式“测试”它。它可以像创建一个具有两个连续指针的结构然后检查它们的“步幅”一样简单。

              【讨论】:

              • 不,在启用 64 位的处理器上运行 32 位代码无济于事。