Como dice el título, ¿existe alguna forma elegante y segura de determinar si la arquitectura es de 32 bits o de 64 bits? Por elegante, puede pensar en forma precisa, correcta, corta, limpia e inteligente. Por seguridad, piense en seguridad en términos de la norma, C89/C99, y la independencia del sistema operativo.Elegante y segura manera de determinar si la arquitectura es de 32 bits o 64 bits
Respuesta
El tamaño de los punteros no es realmente algo bueno para probar: de todos modos, no hay mucho en la norma C que pueda hacer con el resultado de esa prueba.
Mi sugerencia es la prueba ((size_t)-1)
, el tamaño del objeto más grande que el C entiende:
if ((size_t)-1 > 0xffffffffUL)
{
printf("> 32 bits\n");
}
else
{
printf("<= 32 bits\n");
}
Si es mayor que 0xffffffffUL
entonces se puede, en principio, tener objetos más grandes que 2**32 - 1
bytes, lo que parece una prueba más significativa que un nebuloso "32 bits versus 64 bits".
(Por ejemplo, si se sabe que el valor máximo de size_t
sólo es 2**32 - 1
, entonces no hay razón para tratar de mmap()
una región más grande que 1 o 2 GB.)
La forma más común es probar sizeof(void*)
y sizeof(int)
(tenga en cuenta que no tienen que ser necesariamente los mismos).
Otra posibilidad en las CPU x86/x64 es probar el indicador 'lm'. Si está presente, la CPU entiende el conjunto de instrucciones AMD64.
Lo que sugiere es encontrar ambos tamaños y luego determinar la arquitectura. Otra sugerencia, para probar la bandera 'lm' suena que requiere un código ensamblador en C. ¿Correcto? – mtasic85
Solo he visto la prueba de instrucciones específicas en el código (y fue ensamblador, sí). Sin embargo, muchos sistemas operativos exponen los indicadores de CPU en el área de usuario. Linux, por ejemplo, le da esta información en/proc/cpuinfo. Pero esto daría como resultado un código dependiente del sistema operativo. – ypnos
¿Qué pasa si tienes una versión del compilador de 32 bits ejecutándose en una máquina de 64 bits, seguramente eso no funcionaría? – Matt
respuesta corta: sin
respuesta larga: depende de demasiadas combinaciones de OS/compilador. Por ejemplo, en tiempo de ejecución, en Linux puede consultar el sistema de archivos proc mientras que en Windows puede consultar el registro.
se puede demostrar que el compilador que se están utilizando para la compilación tiene un 32/64 bits objetivo usando algo como:
bool is_32bit() {
return sizeof(int *) == 4;
}
bool is_64bit() {
return sizeof(int *) == 8;
}
esto podría funciona bajo unos supuestos (por ejemplo, funciona en tiempo de ejecución). Puede buscar el tiempo de compilación #define
para su plataforma, pero es un desastre bien conocido.
Si activa la optimización no se evaluará en el tiempo de ejecución, se eliminará el código innecesario de 32/64 bits. Además, * bool * no está en ningún estándar C. – jbcreix
"Además, bool no está en ningún estándar C". - falso, está en el estándar C99 en
oops. punto tomado, aún, no es C89 que se especifica en la pregunta, probablemente debido a este tipo de cosas extrañas en c99. – jbcreix
Si está utilizando GCC (como se indica en las etiquetas), se puede probar, como una prueba de tiempo de compilación
#if __SIZEOF_POINTER__ == 8
para averiguar si se trata de un sistema de 64 bits. Asegúrese de que la versión de GCC que está utilizando define __SIZEOF_POINTER__
antes de usarlo.
Esto soluciona el problema en tiempo de compilación para GCC, y está bien hasta el momento. – mtasic85
+0 La respuesta de dfa es portable (una vez que elimina su tipo de bool extraño) y hará que el código sea más limpio. La función siempre devolverá verdadero o falso y el compilador eliminará el código innecesario. – jbcreix
Desafortunadamente, es imposible utilizar una técnica segura y portátil (porque seguro y portátil solo le permite las reglas del Estándar C).
sizeof(int)
con algunos de los compiladores más comunes pueden darle 4 para una plataforma de 32 bits y 8 para una plataforma de 64 bits, pero esto no está garantizado. Todo lo que el estándar C dice es que un int debe ser el tamaño 'natural' para los cálculos en el destino, y tantos compiladores han dejado sizeof (int) como 4 incluso en un mundo de 64 bits, basándose en que es 'suficiente' '.
sizeof(void*)
es mejor porque un puntero debe ser del tamaño adecuado para abordar todo el espacio de direcciones. sizeof(void*)
es probable que le dé 4 u 8 según corresponda. Técnicamente, incluso esto no está garantizado ya que un sizeof le da la cantidad de bytes necesarios para almacenar algo, y un byte no tiene que ser de 8 bits. Un byte es, técnicamente, la unidad de memoria direccionable más pequeña que resulta ser de 8 bits en la mayoría de las plataformas a las que las personas están acostumbradas. 8 bits direccionables es muy común, pero trabajo con chips que son 16 bits direccionables y 16 bits de tamaño de palabra (entonces sizeof(int)
es 1). Entonces, si el tamaño de su byte no es de 8 bits, entonces sizeof(void*)
podría darle una variedad de valores.
Por otro lado, si usted está simplemente tratando de diferenciar entre x86 y x64 (32 bits y 64 bits procesadores de PC) a continuación, sizeof (void *) será suficiente, y portátil a través de compiladores.
Puede multiplicar sizeof (void *) por CHAR_BIT para encontrar su tamaño en bits (aunque el estándar no garantiza que todos los bits en la representación sean bits de valor; de hecho, en las implementaciones x86_64 actuales solo suele haber un lugar en la región de 48 bits de valor en una dirección virtual). – caf
32-bits en el banco de código o 32 bits en el banco de datos. :-) Los procesadores 8086 tenían datos de 16 bits con memoria de código de 20 bits. Además, las modernas máquinas de Havard hacen cosas extrañas con la separación de códigos/datos ...
Puede consultar la instrucción cpuid
para procesadores x86. Es posible que otras familias de procesadores no tengan esa instrucción ... YMMV.
int iedx;
__asm
{
mov eax, 0x80000001;
cpuid;
mov, iedx,edx;
}
if (iedx & (1 << 29))
{
return 1;
}
return 0;
la arquitectura de la computadora en la mayoría de los casos no se refiere a x86 y x86_64, sino a la arquitectura genérica. Este código no es estándar ni portátil. – osgx
- 1. Determinar la arquitectura de 32/64 bits en el ensamblaje
- 2. ¿iPhone OS es de 64 bits o 32 bits?
- 3. Determinar la arquitectura JRE de 32 bits frente a la de 64 bits
- 4. Programar determinar si native .exe es de 32 bits o de 64 bits
- 5. ¿Cómo determinar la arquitectura de construcción (32 bits/64 bits) con hormiga?
- 6. uint es de 32 bits, sin importar si el sistema es de 32 o 64 bits?
- 7. Determine si el proceso actual de PowerShell es de 32 bits o de 64 bits.
- 8. ¿Cómo puedo verificar si un binario compilado es de 32 bits o de 64 bits?
- 9. Determinar si un archivo ejecutable (o biblioteca) es de 32 o 64 bits (en Windows)
- 10. 64 bits por división de 32 bits
- 11. ¿Aplicación de 32 bits o de 64 bits en el sistema operativo de 64 bits?
- 12. Qué comando usar para comprobar si python es de 64 bits o de 32 bits
- 13. ¿Cómo puede mi programa determinar si se está ejecutando en Windows de 32 o 64 bits?
- 14. Comprobando si el archivo es de 32 bits o de 64 bits: en Windows
- 15. Cómo determinar si un System.Diagnostics.Process es de 32 o 64 bits?
- 16. Mezcla de 32 bits y 64 bits P/Invoca
- 17. Usando C#, ¿cómo saber si mi máquina es de 64 bits o 32 bits?
- 18. MapViewOfFile compartido entre procesos de 32 bits y 64 bits
- 19. Siempre es de 64 bits en las máquinas de 32 y 64 bits
- 20. ¿Existe una manera estándar de determinar en tiempo de compilación si el sistema es de 32 o 64 bits?
- 21. Objeto compartido/bibliotecas mixtas de 32 bits y 64 bits
- 22. ¿Puedo controlar la arquitectura (32 bits frente a 64 bits) al compilar un ejecutable de pyinstaller?
- 23. Cómo comprobar si IIS está en el modo de 32 bits o de 64 bits
- 24. Determinación de Windows de 64 bits frente a 32 bits
- 25. tamaño de la máquina 64 o 32 bits
- 26. Registros de 64 bits en ventanas de 32 bits
- 27. Interoperabilidad de 32 y 64 bits en Windows de 64 bits
- 28. Compilación de 32 bits con llvm-gcc de 64 bits
- 29. Utilice un instalador de NSIS para instalar binarios de 32 bits en sistemas operativos de 32 bits y binarios de 64 bits en sistemas operativos de 64 bits.
- 30. La máquina virtual de 32 o 64 bits es más rápida en la máquina de 64 bits (vmware)
En C, la pregunta es ambigua: ¿desea saber si el código del programa es de código de 64 bits, o si la CPU soporta código de 64 bits (es decir, como en tiempo de compilación o una prueba de tiempo de ejecución)? –
¿quieres decir en tiempo de compilación o en tiempo de ejecución? Cualquier sistema operativo específico? –
La pregunta no puede responderse sin antes definir lo que quiere decir con una arquitectura de 32 bits o de 64 bits. No hay una definición universalmente aceptada. –