Как узнать, является ли мой процессор 32-битным или 64-битным (на выбранном вами языке)? Я хочу знать это как для процессоров Intel, так и для AMD.
Как я могу узнать, является ли мой процессор 32-битным или 64-битным?
Ответы (9)
Windows, С/С++:
#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 может работать как 32-разрядная на 64-разрядном процессоре.
Для получения дополнительной информации см. здесь: Как определить 64-разрядную версию Windows платформа с .NET?
Сложность здесь в том, что у вас может быть 64-битный процессор, но 32-битная ОС. Если вам небезразличен этот случай, для опроса ЦП потребуется ассемблерная заглушка. Если нет, вы можете запросить ОС легко.
В .NET вы можете отличить x86 от x64, взглянув на свойство Size структуры IntPtr. Свойство IntPtr.Size возвращается в байтах, 8 бит на байт, поэтому он равен 4 на 32-битном ЦП и 8 на 64-битном ЦП. Поскольку мы говорим о 32-битных и 64-битных процессорах, а не о 4-байтовых или 8-байтовых процессорах, мне нравится проводить сравнение по битам, чтобы было более понятно, что происходит.
C#
if( IntPtr.Size * 8 == 64 )
{
//x64 code
}
PowerShell
if( [IntPtr]::Size * 8 -eq 64 )
{
#x64 code
}
В Питоне:
In [10]: import platform
In [11]: platform.architecture()
Out[11]: ('32bit', 'ELF')
Как обычно, довольно аккуратно. Но я почти уверен, что эти функции возвращают платформу, на которой был создан exec, а не платформы, на которых он работает. Есть небольшой шанс, что какой-нибудь гик запустит 32-битную версию на 64-битном компьютере.
Вы можете получить дополнительную информацию, например:
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',
'')
И Т. Д.
Это больше похоже на живые данные :-)
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
}
Я думал, на 64-битном процессоре указатели 64-битные. Таким образом, вместо проверки функций процессора можно использовать указатели для «тестирования» его программно. Это может быть так же просто, как создать структуру с двумя смежными указателями, а затем проверить их «шаг».
Код С#:
int size = Marshal.SizeOf(typeof(IntPtr));
if (size == 8)
{
Text = "64 bit";
}
else if (size == 4)
{
Text = "32 bit";
}
В Linux вы можете определить «разрядность», прочитав
/proc/cpuinfo
eg.
cat /proc/cpuinfo | grep flags
если он содержит
lm
отметьте, что это 64-битный процессор x86 (даже если у вас установлен 32-битный Linux)
Не уверен, что это работает для процессоров, отличных от x86, таких как PPC или ARM.