Pregunta

¿Cómo puedo saber si mi procesador es de 32 o 64 bits (en el idioma que elija)? Quiero saber esto para los procesadores Intel y AMD.

¿Fue útil?

Solución

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;
}

Otros consejos

C #, agnóstico del sistema operativo

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

Esto es algo crudo, pero básicamente le dice si el CLR se está ejecutando como 32 bits o 64 bits, lo que es más probable que necesite saber. El CLR puede ejecutarse como 32 bits en un procesador de 64 bits, por ejemplo.

Para obtener más información, consulte aquí: Cómo detectar Windows ¿Plataforma de 64 bits con .NET?

El bit difícil aquí es que puede tener una CPU de 64 bits pero un sistema operativo de 32 bits. Si le importa ese caso, necesitará un talón de ASM para interrogar a la CPU. Si no, puedes preguntar al sistema operativo fácilmente.

En .NET puede diferenciar x86 de x64 mirando la propiedad Tamaño de la estructura IntPtr. La propiedad IntPtr.Size se devuelve en bytes, 8 bits por byte, de modo que es igual a 4 en una CPU de 32 bits y 8 en una CPU de 64 bits. Ya que hablamos de procesadores de 32 y 64 bits en lugar de procesadores de 4 u 8 bytes, me gusta hacer la comparación en bits, lo que deja más claro lo que está pasando.

C #

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

PowerShell

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

En Python:

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

Como de costumbre, bastante ordenado. Pero estoy bastante seguro de que estas funciones devuelven la plataforma donde se ha construido el ejecutivo, no las plataformas en las que se ejecuta. Todavía hay una pequeña posibilidad de que algún geek esté ejecutando una versión de 32 bits en una computadora de 64 bits.

Puedes tener más infos como:

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.

Esto se parece más a datos en vivo :-)

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

Otra solución posible para Windows Script Host, esta vez en JScript y utilizando la variable de entorno 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
}

Estaba pensando, en un procesador de 64 bits, los punteros son de 64 bits. Entonces, en lugar de verificar las características del procesador, tal vez sea posible usar punteros para "probarlo" programáticamente. Podría ser tan simple como crear una estructura con dos punteros contiguos y luego verificar su 'zancada'.

Código C #:

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

En Linux puede determinar el " bitness " leyendo

/proc/cpuinfo

por ejemplo.

cat /proc/cpuinfo | grep flags

si contiene el

lm

marca que es una CPU x86 de 64 bits (incluso si tienes instalado Linux de 32 bits)

No estoy seguro de si esto funciona también para CPU que no sean x86, como PPC o ARM.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top