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

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

Ответы [ 9 ]

20 голосов
/ 05 мая 2009

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;
}
8 голосов
/ 05 мая 2009

C #, ОС Агностик

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

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

Подробнее см. Здесь: Как определить 64-битную платформу Windows с помощью .NET?

4 голосов
/ 05 мая 2009

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

2 голосов
/ 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 
}
1 голос
/ 05 июня 2009

В Python:

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

ETC.

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

1 голос
/ 05 июня 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
}
0 голосов
/ 05 июня 2009

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

/proc/cpuinfo

например.

cat /proc/cpuinfo | grep flags

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

lm

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

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

0 голосов
/ 05 июня 2009

C # код:

int size = Marshal.SizeOf(typeof(IntPtr));
if (size == 8)
{
 Text = "64 bit";
}
else if (size == 4)
{
 Text = "32 bit";
}
0 голосов
/ 05 мая 2009

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

...