Как я могу узнать, является ли мой процессор 32-битным или 64-битным?

Как узнать, является ли мой процессор 32-битным или 64-битным (на выбранном вами языке)? Я хочу знать это как для процессоров Intel, так и для AMD.


person ilias    schedule 05.05.2009    source источник
comment
Вам нужно будет хотя бы указать язык, на котором вы пытаетесь найти эту информацию.   -  person JaredPar    schedule 05.05.2009
comment
Это не похоже на вопрос программирования.   -  person mmx    schedule 05.05.2009
comment
Нет, это не вопрос программирования. должен быть закрыт   -  person Alexander Stolz    schedule 05.05.2009
comment
Поскольку главный ответ на самом деле связан с программированием, я подумал, что воспользуюсь возможностью, чтобы сделать вопрос более явным (и проголосовать за повторное открытие). Этот ответ очень удобно знать.   -  person paxdiablo    schedule 05.05.2009
comment
Я тоже хочу, чтобы он открылся. Это на самом деле довольно интересно!   -  person AndreasT    schedule 05.05.2009
comment
Вопрос не так ясен, как должен быть, но мне кажется, что программа (на выбранном вами языке) может найти то, на чем она работает. Я бы назвал это вопросом программирования. Готов поклясться, что это обман, но я ничего не вижу на боковой панели Relate.   -  person David Thornley    schedule 05.05.2009
comment
О какой операционной системе здесь идет речь?   -  person Milan Babuškov    schedule 05.06.2009


Ответы (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;
}
person plinth    schedule 05.05.2009
comment
Можете ли вы указать, какой это язык (да, я знаю, но другие могут не знать) и какие-либо другие требования (например, заголовочные файлы)? - person paxdiablo; 05.05.2009
comment
Или, если уж на то пошло, какая ОС? Будет ли это работать на моем Mac Mini, моих компьютерах с Linux и моих системах Windows XP и Vista? - person David Thornley; 05.05.2009
comment
Бах - не могу редактировать... но поэтому нужно добавить "по умолчанию:" к этому переключателю... :-) - person saw-lau; 05.06.2009

C#, независимый от ОС

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

Это несколько грубо, но в основном говорит вам, работает ли CLR как 32-битная или 64-битная, что, скорее всего, вам нужно знать. Например, среда CLR может работать как 32-разрядная на 64-разрядном процессоре.

Для получения дополнительной информации см. здесь: Как определить 64-разрядную версию Windows платформа с .NET?

person Matt Howells    schedule 05.05.2009

Сложность здесь в том, что у вас может быть 64-битный процессор, но 32-битная ОС. Если вам небезразличен этот случай, для опроса ЦП потребуется ассемблерная заглушка. Если нет, вы можете запросить ОС легко.

person Joshua    schedule 05.05.2009

В .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 
}
person Brian Reiter    schedule 05.06.2009

В Питоне:

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',
 '')

И Т. Д.

Это больше похоже на живые данные :-)

person e-satis    schedule 05.06.2009
comment
Я тот выродок. 64-битный Python существует, но трудно получить готовые модули для этой архитектуры, и почти так же сложно получить работающие скомпилированные локально. - person SingleNegationElimination; 05.06.2009

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
}
person Helen    schedule 05.06.2009

Я думал, на 64-битном процессоре указатели 64-битные. Таким образом, вместо проверки функций процессора можно использовать указатели для «тестирования» его программно. Это может быть так же просто, как создать структуру с двумя смежными указателями, а затем проверить их «шаг».

person sybreon    schedule 05.05.2009
comment
Нет, не поможет с 32-битным кодом, работающим на 64-битном процессоре. - person mghie; 05.05.2009

Код С#:

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

В Linux вы можете определить «разрядность», прочитав

/proc/cpuinfo

eg.

cat /proc/cpuinfo | grep flags

если он содержит

lm

отметьте, что это 64-битный процессор x86 (даже если у вас установлен 32-битный Linux)

Не уверен, что это работает для процессоров, отличных от x86, таких как PPC или ARM.

person Ben Schwehn    schedule 05.06.2009