如何确定我的处理器是 32 位还是 64 位(使用您选择的语言)?我想知道英特尔和 AMD 处理器的这一点。
9 回答
视窗,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;
}
C#,与操作系统无关
sizeof(IntPtr) == 4 ? "32-bit" : "64-bit"
这有点粗略,但基本上可以告诉您 CLR 是以 32 位还是 64 位运行的,这很可能是您需要知道的。例如,CLR 可以在 64 位处理器上作为 32 位运行。
有关详细信息,请参阅此处:如何使用 .NET 检测 Windows 64 位平台?
这里棘手的一点是你可能有一个 64 位的 CPU,但一个 32 位的操作系统。如果您关心这种情况,它将需要一个 asm 存根来询问 CPU。如果没有,您可以轻松询问操作系统。
在 .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
}
电源外壳
if( [IntPtr]::Size * 8 -eq 64 )
{
#x64 code
}
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
}
在 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 位处理器上,指针是 64 位的。因此,与其检查处理器功能,不如使用指针以编程方式“测试”它。它可以像创建具有两个连续指针的结构然后检查它们的“步幅”一样简单。
C#代码:
int size = Marshal.SizeOf(typeof(IntPtr));
if (size == 8)
{
Text = "64 bit";
}
else if (size == 4)
{
Text = "32 bit";
}
在linux中,您可以通过阅读来确定“位数”
/proc/cpuinfo
例如。
cat /proc/cpuinfo | grep flags
如果它包含
lm
标记它是 x86 64 位 CPU(即使您安装了 32 位 linux)
不确定这是否适用于非 x86 CPU 以及 PPC 或 ARM。