¿Mi sistema operativo es de 32 bits o de 64 bits?

53

Ya no es demasiado importante, pero de vez en cuando alguien necesita saberlo.

Aquí hay un simple golf: sin tener en cuenta la opinión del usuario, ¡dígame si la computadora en la que se ejecuta el código está en un sistema operativo de 64 bits o en un sistema operativo de 32 bits!

Si el código se ejecuta en un sistema operativo de 32 bits, imprima "32", si el código se ejecuta en un sistema operativo de 64 bits, envíe "64". Importante: Imprima cualquier otra cadena no vacía de caracteres alfanuméricos si no tiene 32 o 64 bits.

Tenga en cuenta que un programa de 32 bits que se ejecuta en una computadora con un sistema operativo de 64 bits debe generar "64". Puede suponer que los usuarios utilizarán software de 64 bits siempre que sea posible.

Para ser elegible para la entrada, su código debe poder ejecutarse en Windows 4.10 o sistemas Windows más nuevos compatibles con Microsoft, y al menos una versión de Linux de su elección (siempre que esa versión sea gratuita). Se pueden instalar modificaciones de compatibilidad, siempre y cuando el programa todavía devuelva el valor correcto.

Se aplican las reglas habituales de .

Nota: Si su respuesta solo pretende imprimir 32 o 64, pero no el caso alternativo, lo aceptaré, pero no es una respuesta competitiva.

¡Intentaré publicar algunos resultados de ejecutar estos códigos en diferentes sistemas operativos más adelante!

tuskiomi
fuente
55
Entonces, "Tenga en cuenta que un programa de 32 bits que se ejecuta en una computadora con un sistema operativo de 64 bits debe generar" 64 ". Puede suponer que los usuarios utilizarán software de 64 bits siempre que sea posible". significa que si el intérprete / compilador, etc. está disponible tanto en 32 bits como en 64 bits, entonces un SO de 32 bits siempre ejecutará la versión de 32 bits del intérprete / etc, y el SO de 64 bits siempre ejecutará el intérprete de 64 bits / etc. Así que preocuparse por la diferencia entre el programa que se está 32 o 64, y el sistema operativo es de 32 o 64, es básicamente solamente un problema para los idiomas con sólo 32 bits implementaciones. ¿Derecho?
Lyndon White
2
Muchas soluciones aquí imprimirían "32" en un sistema operativo de 64 bits si se utilizara un compilador de 32 bits para compilar el programa. ¿Esta bien?
Martin Rosenau
15
¿Qué demonios es "Windows 4.10"? ¿Eso significa Windows 98? ¿O significa Windows NT 4? ¿Qué consideras que es "más nuevo" que eso? Este parece un desafío excepcionalmente mal pensado.
Cody Gray
13
No existe una "especificación oficial de Windows", y nadie se refiere a Windows 98 como "Windows 4.10". Eres literalmente el primero. Entonces, tal vez en lugar de tratar de sonar genial u oficial mediante el uso de números de versión, solo debe usar el nombre real del producto . Por cierto, Windows 9x nunca estuvo disponible en una compilación de 64 bits, entonces, ¿es realmente legítimo para mí enviar una entrada que solo se ejecuta en Windows 98 y solo devuelve "32"? Parece muy injusto / antideportivo / poco interesante, pero técnicamente sería permitido por sus reglas.
Cody Gray
3
Aún no ha respondido la pregunta sobre la versión de Windows. ¿ Debe poder ejecutarse en Windows 4.10 o posterior significa en Windows 4.10 y todas las versiones más recientes o en cualquier versión de Windows, 4.10 o posterior ?
Dennis

Respuestas:

44

Conjunto x86 (políglota), 13 bytes

Bytecode:

31 c0 b4 80 48 70 05 04 40 83 e0 60 c3

Define una función que devuelve 32 si se interpreta como 32 bits, 64 si es de 64 bits y 32767 si es de 16 bits.

Quería hacer un políglota que se ejecutara en Windows y Linux, pero esto es mucho más difícil de lo que pensaba. Como es, no estoy seguro de que haya alguna forma de imprimir un valor en Windows que no sea de 16 bits sin vinculación.

Explicación

Este código usa dos tell para determinar la arquitectura en la que se está ejecutando. La primera es la instrucción 0x48, en 16 y 32 bits, esto es dec %eax, pero en 64 bits, es un prefijo de tamaño de instrucción. El segundo indicador es la misma instrucción, sin embargo, cuando lo ejecutamos en el valor 0x8000, el bit más significativo se voltea solo si el tamaño del registro es de 16 bits, configurando el indicador de desbordamiento y permitiéndonos usarlo jo.

En 16 bits, este código se interpreta de la siguiente manera:

   0:   31 c0                   xor    %ax,%ax    /* 0x0000 */
   2:   b4 80                   mov    $0x80,%ah  /* 0x8000 */
   4:   48                      dec    %ax        /* 0x7fff */
   5:   70 05                   jo c              /* taken  */
   7:   04 40                   add    $0x40,%al
   9:   83 e0 60                and    $0x60,%ax
   c:   c3                      ret               /* 0x7fff */

En 32 bits, este código se interpreta de la siguiente manera:

   0:   31 c0                   xor    %eax,%eax   /* 0x00000000 */
   2:   b4 80                   mov    $0x80,%ah   /* 0x00008000 */
   4:   48                      dec    %eax        /* 0x00007fff */
   5:   70 05                   jo c               /* not taken  */
   7:   04 40                   add    $0x40,%al   /* 0x00007f3f */
   9:   83 e0 60                and    $0x60,%eax  /* 0x00000020 */
   c:   c3                      ret

En 64 bits, este código se interpreta de la siguiente manera:

   0:   31 c0                   xor    %eax,%eax   /* 0x00000000 */
   2:   b4 80                   mov    $0x80,%ah   /* 0x00008000 */
   4:   48 70 05                rex.W jo c         /* not taken  */
   7:   04 40                   add    $0x40,%al   /* 0x00008040 */
   9:   83 e0 60                and    $0x60,%eax  /* 0x00000040 */
   c:   c3                      ret
ObsequiousNewt
fuente
Esto en realidad probablemente está a la cabeza, muy agradable
tuskiomi
1
Una idea muy clara, pero tal como se implementó, devolverá el valor incorrecto si se ensambla como un binario de 32 bits y se ejecuta en un sistema operativo de 64 bits.
Cody Gray
@CodyGray de las reglas: puede asumir que los usuarios utilizarán software de 64 bits siempre que sea posible. Supongo que esto también significa que para las funciones podemos suponer que el código de la persona que llama es de 64 bits siempre que sea posible.
Ruslan
Ah, supongo que es una interpretación justa, @Ruslan. Y veo que ya ha publicado la respuesta que tenía en mente , si no fuera por este problema. :-) Tienes mi voto a favor.
Cody Gray
Qué 48representa el byte dec %eaxen modo de 16 bits?
phuclv
48

código de máquina x86, 12 bytes

8c c8 83 f8 23 b0 20 75 02 00 c0 c3

Sin golf:

getKernelBitness:
    mov eax,cs
    cmp eax,0x23 ; 32 bit process on 64 bit kernel has this selector in CS
    mov al,32
    jne kernelIs32Bit
    add al,al    ; return value in eax
kernelIs32Bit:
    ret

Esta función funciona en Linux cuando se usa en ELF32, siguiendo i386 SysV ABI, así como en Windows / Wine cuando se usa en PE32, después de la stdcallconvención de llamada.

Ruslan
fuente
En realidad, uno puede reducir el conteo de bytes aún más si sigue otro enfoque .
Ruslan
¿Qué haría esto teóricamente en un entorno que no sea de 32/64 bits?
tuskiomi
1
@tuskiomi En cualquier caso, este código aún devolverá 32 o 64. La única diferencia de interpretar esta secuencia de bytes en modo de 16 bits será un cambio de mnemotecnia de eaxa ax. Por lo tanto, si el selector en cspasa a ser 0x23, el resultado será 64, de lo contrario 32.
Ruslan
Sin embargo, esto parece específico para dos sistemas operativos particulares. Fácilmente podría tener un sistema de 32 bits con cs = 0x23. Vea en cambio mi respuesta de 8 bytes que apunta a la CPU.
Peter Ferrie
@ Peterferrie, sí, por eso tengo otra respuesta . Pero el tuyo lo supera en 2 bytes.
Ruslan
32

Mathematica, 17 bytes

$SystemWordLength
J42161217
fuente
13
Por supuesto que hay un incorporado! \ s (+1)
tuskiomi
¿No debería agregar &o especificar que esto está en REPL?
LegionMammal978
55
@ LegionMammal978 "Si el código se ejecuta en un sistema operativo de 32 bits, imprima" 32 ", si el código se ejecuta en un sistema operativo de 64 bits, imprima" 64 ". Imprima cualquier (otra) cadena no vacía de caracteres alfanuméricos si no es ninguno ". No "proporciona una función que, cuando se ejecuta, hace esto"; solo "haz esto".
Patrick Stevens
17
@PatrickStevens: si la pregunta no especifica qué forma debe tomar un envío, es un programa o función, pero no un fragmento, de forma predeterminada .
3
@ ais523 Yo diría que no hay distinción en Mathematica entre programas, funciones y fragmentos. Todo es solo una expresión.
ngenisis
21

Cargadores de arranque

¿Sabía que GRUB e IPXE tienen lenguajes de programación completos de Turing accesibles en tiempo de ejecución? La familia de cargadores de arranque Syslinux no, pero pueden hacer esto.

IPXE, 36 bytes

#!ipxe
cpuid --ext 29 && echo 64 || echo 32

la primera línea es necesaria si el script se ejecuta de forma remota, pero no si se escribe directamente en la línea de comando.

GRUB, 42 bytes

if cpuid -l ; then
echo 64
else
echo 32
fi

Syslinux, 186 bytes

Esto toma tres archivos, el primero es syslinux.cfg (o isolinux.cfg, etc.).

label a
  kernel ifcpu64.c32
  append s -- t

label s
  kernel menu.c32
  append s.cfg

label t
  kernel menu.c32
  append t.cfg

default a
prompt 0
timeout 0

y t.cfg

menu title 32

ans s.cfg

menu title 64

Para este, la parte difícil es que syslinux no tiene capacidades simples de visualización de texto, por lo que se abusa del menú.

hildred
fuente
No estoy seguro si puede decir la resolución del sistema
operativo
Comprueba la CPU y se utiliza para seleccionar el sistema operativo correcto. Esto es básicamente un código de golf de mi proyecto de inicio.
hildred
2
Por lo tanto, cambia el sistema operativo según la arquitectura. Pensar más allá. Me gusta.
tuskiomi
¿Cuál es el bytecount?
Restioson
1
@hildred Creo que sería más legible si lo ## iPXE, 36 bytes### ipxe 36
usaras en
21

Julia 14 13 bytes

n->8sizeof(1)

Explique:

  • Función Anon, tomar cualquier cosa (incluido nothing) devolver un número entero 32 o 64
  • Los literales enteros son de tipo Intque, dependiendo de si 32 bits o 64 bits, es un Int32o un Int64( 1podría ser cualquier dígito)
  • colocar un número antes de una llamada de función hace una multiplicación de yuxtaposición
  • Esta es básicamente una versión reducida del código paraSys.WORD_SIZE , utilizada en la respuesta de rahnema1

Otra respuesta divertida es ()->"$(Int)"[4:5], pero no puedo contar la cuenta atrás de esa.


-1 gracias a @Roman Gräf

Lyndon White
fuente
Podría usar un argumento ficticio: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf
19

julia, 20 17 16 bytes

n->Sys.WORD_SIZE

* Gracias a @LyndonWhite guardó 3 bytes * Gracias a @ RomanGräf guardó un byte

Respuestas anteriores:

()->Sys.WORD_SIZE
print(Sys.WORD_SIZE)

Pruébalo en línea!

rahnema1
fuente
1
¡A mí personalmente me gusta este!
tuskiomi
2
Siguiendo la convención: codegolf.meta.stackexchange.com/q/2419/62131 puede reducir 3 bytes haciendo()->Sys.WORD_SIZE
Lyndon White
1
También podría usar un argumento ficticio: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf
14

JavaScript (Node.js), 24 bytes

_=>process.arch.slice(1)

Esta es una función y regresa '32', '64'o si ninguno 'rm'.

Downgoat
fuente
+1, pero supongo que un arco de 64 bits podría estar ejecutando un SO de 32 bits sin embargo
Octopus
1
Me da '32' en Windows de 32 bits, por lo que parece funcionar.
Ken YN
55
Puede reducir 7 bytes si está utilizando REPL y en oslugar de process:os.arch().slice(1)
GilZ
Esto devuelve la arquitectura del sistema operativo informada al proceso, no la arquitectura real del sistema operativo. Entonces esto no funciona en Linux. (Pon "setarch" en tu motor de búsqueda favorito.)
David Schwartz
@DavidSchwartz funciona bien en mi caja de Linux a menos que esté malinterpretando, pero en PPCG podemos asumir un entorno no modificado en términos de que el usuario cambie el arco
Downgoat
13

C, 33 31 29 23 bytes

f(){return sizeof&f*8;}

¡Gracias a los comentaristas @ceilingcat y @Dennis por los consejos de golf!

Govind Parmar
fuente
13
También dice que se aplican las reglas habituales de golf de código, y que regresar de una función es parte de nuestros valores predeterminados para E / S.
Dennis
11
¿No va a depender eso de si compilas como un programa de 32 o 64 bits?
Ken YN
44
Esto no cumple con los requisitos. " Tenga en cuenta que un programa de 32 bits que se ejecuta en una computadora con un sistema operativo de 64 bits debe generar" 64 ". " Esto le indica cómo se compiló el programa, no cuál es el sistema operativo.
David Schwartz
2
@DavidSchwartz "Puede asumir que los usuarios utilizarán software de 64 bits siempre que sea posible".
Klas Lindbäck
2
Lamento decir eso, pero sizeof se evalúa en tiempo de compilación. Entonces, si compila un exe de 32 bits y lo ejecuta en una máquina de 64 bits, superará a 32 mientras debería generar 64 ( stackoverflow.com/questions/2615203/… ). Buena idea sin embargo!
Dinaiz
11

PowerShell, 16 bytes

8*[IntPtr]::Size

Obtiene el tamaño del puntero en bytes, se multiplica por 8 para obtener bits.

Chirishman
fuente
-1 porqueyour code must be able to run on Windows 4.10 or newer
ub3rst4r
11
@ ub3rst4r o más reciente, no y más nuevo. Estoy dispuesto a apostar que una buena parte de estas respuestas son difíciles, en el mejor de los casos, de ejecutarse en una versión de Windows que no es compatible. Tampoco es razonable esperar que las personas prueben en 98 de todos los sistemas operativos: en estos días ni siquiera es fácil instalarlo en una máquina virtual (confía en mí, lo he intentado. No se ejecutará en KVM, y tiene interacciones interesantes con los adaptadores de pantalla VBox) . (Ni siquiera tiene un concepto de 64 bits ... ese es un requisito realmente ridículo.)
Bob
1
@ ub3rst4r ¡Dudo que todos los lenguajes de programación interpretados aquí tengan una implementación que funcione en Windows 4.10!
Martin Rosenau
1
Parece que falla si se trata de un PowerShell de 32 bits en un sistema operativo de 64 bits.
Chris J
@ChrisJ Al menos en Win10 y Win2012 R2 devuelve el resultado adecuado de x86 PowerShell. No he probado en Linux.
Booga Roo
10

Python 2, 52, 48, 42 41 bytes

from struct import*;print calcsize("P")*8

Gracias a totalmente humano!

Daniel
fuente
¡enfocar! cruzar la línea en menos de un minuto.
tuskiomi
Voy a esperar a probar esto hasta que esté en casa, pero no estoy seguro de que imprima "32" y "64", pero estoy seguro de otros casos.
tuskiomi
@tuskiomi, esto imprime "32 bits" o "64 bits"
Daniel
1
from struct import*;print calcsize("P")*8Es más corto.
Totalmente humano
12
Si ejecuta esto en Python de 32 bits en un sistema operativo de 64 bits, creo que esto le mentirá. La mayoría de las otras respuestas también parecen sensibles a eso de todos modos ...
Nick T
10

Java 8, 45 bytes

()->System.getProperty("sun.arch.data.model")
Daniel
fuente
@Dopapp Lo que quiere decir es que este es un fragmento, no un programa o función. En Java 8, esto debería funcionar:n=>System.getProperty("os.arch")
NoOneIsHere
@NoOneIsHere, oh, gracias, eso me pasó por la cabeza
Daniel
2
"Si el código se ejecuta en un sistema operativo de 32 bits, imprima" 32 ", si el código se ejecuta en un sistema operativo de 64 bits, imprima" 64 ". Imprima cualquier (otra) cadena no vacía de caracteres alfanuméricos si es ninguno.". Esto no hace eso en absoluto ...
Olivier Grégoire
44
¿Puedes obtener Java 8 para Windows 98 (v4.10)?
TessellatingHeckler
44
@TessellatingHeckler Java 8 requiere "i586" (lo que sea que eso signifique). La entrada dice: "su código debe poder ejecutarse en Windows 4.10 o posterior", no "su código debe poder ejecutarse en Windows 4.10 y posterior". Se ejecuta en un Windows más nuevo .
Olivier Grégoire
9

Perl 6 , 17 bytes

say $*KERNEL.bits

Intentalo


Hay un relacionado $?BITSque contiene el número de bits que tiene un nativo inten el tiempo de ejecución.

say $?BITS

Intentalo

Brad Gilbert b2gills
fuente
8

Windows CMD, 56 52 bytes (¡gracias Bob!)

if EXIST "%ProgramFiles(x86)%" (echo 64)else echo 32

Todavía sorprendentemente largo, ¡el más largo hasta ahora!

Ken YN
fuente
1
En realidad, %windir%\SysWOW64es aún más corto, creo ...
Bob
77
" debe poder ejecutarse en Windows 4.10 o posterior, y al menos una versión de Linux de su elección ", ¿qué versión de Linux para esto?
TessellatingHeckler
1
@TessellatingHeckler si instala Wine ...?
Ken YN
1
¿Qué pasa con el uso de taquigrafía? if EXIST "c:\Progra~3" (echo 64)else echo 32De manera predeterminada, usted tiene ProgramDatay, Program Filessi existe un tercero, deberíamos ser 64
Marie
3
¿Qué imprimirá esto para un sistema operativo de 8 bits?
tuskiomi
7

C, Win32 API, 103 183 bytes

#include <windows.h>
typedef int(WINAPI*F)(HANDLE,int*);b;main(){F f=GetProcAddress(GetModuleHandle("kernel32"),"IsWow64Process");return(f!=0&&f(GetCurrentProcess(),&b)&&!b)?32:64;}

En realidad hay más de 2 casos aquí. Vamos a examinarlos

  • Lo más fácil: IsWow64Processno existe: estamos en un sistema operativo de 32 bits

Para los próximos dos casos, necesitamos saber que nuestro binario será un ejecutable de 32 bits. Y esta descripción de lo que estará fuera del parámetro out deIsWow64Process

Un puntero a un valor que se establece en TRUE si el proceso se ejecuta en WOW64. Si el proceso se ejecuta en Windows de 32 bits, el valor se establece en FALSO. Si el proceso es una aplicación de 64 bits que se ejecuta en Windows de 64 bits, el valor también se establece en FALSO.

Eso nos deja con dos casos adicionales:

  • IsWow64Process existe, y produce VERDADERO -> Estamos en una máquina de 64 bits
  • IsWow64Process existe, y produce FALSO -> Estamos en una máquina de 32 bits

No nos preocupa la parte en que una aplicación de 64 bits en un Windows de 64 bits produce FALSO. Como sabemos que nuestra aplicación es de 32 bits

Ah, y hay un caso adicional que no está cubierto por este desafío y que debería ser raro de todos modos:

  • IsWow64Process existe, pero falla: el valor predeterminado es la máquina de 32 bits.

Esto debería cubrir la mayoría de los sistemas operativos Windows NT. Solo he probado en Win10 de 64 bits, Win 7 de 64 bits, Win 8.1 de 32 bits y WinXP SP1 de 32 bits


Respuesta original:

#include<windows.h>
main(){return GetProcAddress(GetModuleHandle("Kernel32"),"IsWow64Process")?64:32;}

Para estar seguros, necesitamos distinguir solo 2 casos

  • IsWow64Process no existe en kernel32.dll => Estamos en una máquina de 32 bits.

  • IsWow64Process existe => Estamos en una máquina de 64 bits.

El valor real proporcionado por IsWow64Processes irrelevante para este desafío, ya que queremos que el binario sea de 32 bits en cualquier caso.

A diferencia de la mayoría de las respuestas, esto no depende de que el binario se compile en la máquina en la que se ejecuta.

Si conociera una función más corta que está presente solo en máquinas de 64 bits y no en máquinas de 32 bits, podría acortar la respuesta.

MrPaulch
fuente
2
Descarte la .dllcadena del nombre del módulo. Esto no solo es bueno para el golf, sino que también es una mejor práctica en el uso normal. Además, para fines de golf, puede dejar el espacio después #include.
Cody Gray
Gracias, en realidad quería reducir todo esto solo buscando un módulo que se pueda encontrar en 64 bits pero no en 32 bits. Todavia estoy mirando. Lamentablemente (para este propósito) no hay un módulo llamado WoW64.
MrPaulch
En realidad hay un wow64.dlly Wow64Win.dll, pero nunca he tratado de llamar GetModuleHandlecon ellos. Sin embargo, el problema es que solo se cargarían para un proceso de 32 bits que se ejecuta en una máquina de 64 bits, no para un proceso de 64 bits que se ejecuta en una máquina de 64 bits.
Cody Gray
Yo tengo. Devuelven 0 incluso en una máquina de 64 bits. Tiene sentido en realidad. No existen para vincularse directamente. El sistema se encarga de la redirección durante el tiempo de ejecución.
MrPaulch
Ooh, problema sin embargo. De la documentación del SDK: "Tenga en cuenta que esta técnica no es una forma confiable de detectar si el sistema operativo es una versión de Windows de 64 bits porque Kernel32.dll en las versiones actuales de Windows de 32 bits también contiene esta función".
Cody Gray
7

C #, 60 50 bytes

_=>System.Environment.Is64BitOperatingSystem?64:32

Gracias @TheLethalCoder

kakkarot
fuente
1
Bienvenido al sitio! :)
DJMcMayhem
44
Ahorre 4 bytes si elimina 'Línea'
John
1
también puede eliminar 'Medio ambiente'. y 'consola'. asumiendo el uso de using static System.Environment;yusing static System.Console;
John
1
también, cambie WriteLineaWrite
Thomas Ayoub
77
@John La última vez que lo verifiqué, las importaciones deben incluirse y, por lo tanto, se agregarían al recuento de bytes
Ceshion el
6

Ruby, 22 bytes

p [?a].pack(?p).size*8

["any string"].pack("p")devuelve una cadena cuyos bytes corresponden al puntero que apunta hacia "any string", y tiene 8 caracteres si el sistema operativo es de 64 bits, o 4 caracteres si el sistema operativo es de 32 bits.

Tinta de valor
fuente
Dado que esto utiliza el tamaño del puntero, imprimirá 32 bits cuando el intérprete de Ruby es un binario de 32 bits en un sistema operativo de 64 bits. Así que falla una regla.
DarkDust
1
@DarkDust You can assume that users will use 64 bit software whenever possible.Por lo tanto, se supondrá que los usuarios de 64 bits ejecutarán Ruby de 64 bits.
Value Ink
6

R, 16 bytes

.Machine[[18]]*8

Devuelve el tamaño del puntero.

Sven Hohenstein
fuente
1
Al igual que todas las soluciones de tamaño de puntero, esto imprimirá el resultado incorrecto cuando el programa es un binario de 32 bits que se ejecuta en un sistema operativo de 64 bits.
DarkDust
1
@DarkDust R se interpreta, y podemos suponer que el usuario usa software de 64 bits siempre que sea posible, por lo que también un intérprete de 64 bits. En mi humilde opinión, la regla solo se aplica a los idiomas compilados
NieDzejkob
@NieDzejkob Esa es exactamente la misma lógica que utilicé para mi respuesta en PHP cuando alguien más puso el mismo tipo de comentario en respuesta a mi respuesta, deseo que otros lean lo mismo de la pregunta que asumimos al suponer que los usuarios usarán 64- software de bits siempre que sea posible con idiomas interpretados.
Bja
6

Perl, 18 15 18 bytes

say length pack p8
Mugriento
fuente
Me conecto 64␤a mi computadora de 32 bits, porque perlfue construida con un IV de 64 bits. Encontrarás que este suele ser el caso cuando se ejecuta en la versión de Windows de 32 bits.
Brad Gilbert b2gills
@ BradGilbertb2gills Revertí el código a la versión anterior; este debería funcionar incluso en este caso. Avíseme si aún no funciona, eliminaré mi respuesta.
Grimmy
1
Eso funciona correctamente
Brad Gilbert b2gills
Parece incorrecto en HP 9000/785. Da 32. Pero no creo que haya CPUs HP / PA-RISC de 32 bits.
Ole Tange
6

código de máquina x86, 8 bytes

31 C0 B0 40 48 24 60 C3

Sin golf:

31 c0    xor eax,eax
b0 40    mov al, 0x40
48       dec al — in 32-bit mode; "REX.W" in 64-bit mode (ignored)
24 60    and al, 0x60
c3       ret

Si se compila como un ejecutable de 64 bits, devuelve 64 in eax, y si se compila como 32 bits, devuelve 32, independientemente del sistema operativo.

Esta respuesta se basa en las reglas que dicen:

Puede suponer que los usuarios utilizarán software de 64 bits siempre que sea posible.

Ruslan
fuente
Si bien este es un enfoque interesante, ¿cómo se puede escribir en un programa de tal manera que realmente se pueda ejecutar? Todos los métodos que se me ocurren para ejecutar código binario que no sea escribir su propia función de cargador utilizan archivos que son específicos para el código de 64 bits o 32 bits. Por lo tanto, necesitará dos copias de este código para ejecutarlo realmente ...
Jules
@Jules Puede ponerlo como ensamblaje en línea en un programa de lenguaje de alto nivel, como aquí . Entonces solo necesita usar su compilador nativo de la plataforma con sus opciones predeterminadas, y obtendrá el bitness.
Ruslan
@ l4m2 ¿por qué me gritas? Pero tienes razón de todos modos, estos dos bytes parecen ser algo basura de mis experimentos. Removerá.
Ruslan
5

PHP, 18 bytes

<?=PHP_INT_SIZE*8;

Esto maneja correctamente todos los casos de 32, 64 y otras CPU de bits siempre que PHP_INT_SIZE sea correcto, ¡mostrará el tamaño preciso de la CPU sin importar en qué CPU se esté ejecutando PHP!

Si PHP se está ejecutando en

SO de 32 bits PHP_INT_SIZE == 4,

SO de 64 bits PHP_INT_SIZE == 8,

Sistema operativo de 16 bits PHP_INT_SIZE == 2 (teóricamente)

Sistema operativo de 8 bits PHP_INT_SIZE == 1 (nuevamente teóricamente)

Sistema operativo de 128 bits PHP_INT_SIZE == 16 (Todavía no se ha logrado pero es posible)

Bja
fuente
2
esa constante tiene el tamaño del sistema operativo donde PHP fue construido, no ejecutado
Einacio
2
@Einacio Sí, pero en el desafío inicial el póster escribió "Puede suponer que los usuarios utilizarán software de 64 bits siempre que sea posible", por lo tanto, si el sistema operativo es de 64 bits, entonces se supondrá que la versión de PHP que se ejecuta en el sistema operativo ser de 64 bits! (Nota: no veo esto como una escapatoria, solo lógica pura basada en el desafío inicial).
Bja
4

C # (29 bytes)

Console.Write(IntPtr.Size*8);
James B
fuente
10
Al igual que todas las soluciones de tamaño de puntero, esto imprimirá el resultado incorrecto cuando el programa es un binario de 32 bits que se ejecuta en un sistema operativo de 64 bits.
DarkDust
1
Es necesario especificar que esto se compila para "AnyCPU" con la casilla de verificación "Preferir 32 bits" sin marcar.
Cody Gray
4

Potencia Shell, 17 52 bytes

try{32+32*((gci \*`))-or(arch)[-1]-eq52)}catch{32}

Devuelve 64 si alguno de los siguientes es verdadero:

  • Tiene un directorio en su unidad actual con un nombre de archivo que termina en un par cercano, la idea es detectar Program Files (x86).
  • archdevuelve una cadena que termina en 4(ASCII 52), al igual que x86_64, a diferencia de, por ejemplo i686.

El intento de captura está destinado a eludir el error que obtienes si gci no devuelve nada y no tienes un arco . No he encontrado una forma más corta de hacerlo hasta ahora. gci se usa sobre ls porque en Linux, ls producirá un error visible.

Esta versión debería detectar si el sistema operativo es de 64 bits en lugar de solo PowerShell, y se ha probado que funciona en Windows y Linux. Para soporte de Mac, reemplace archcon uname -m.

Versión anterior solo para Windows: -!(ls \*`))*32+64

Andy C.
fuente
¿en qué distribución de Linux funciona esto?
tuskiomi
@tuskiomi Oh, mi mal, entiendo lo que quieres decir. No leí el desafío correctamente. ¿Debo eliminar la respuesta?
Andy C.
Si sabe que funcionará con WINE, debe conservarlo.
tuskiomi
@tuskiomi Como mínimo Ubuntu 14.04, 16.04, RHEL7, CentOS7 y alguna versión de SUSE: github.com/PowerShell/PowerShell/releases
Xudonax
4

Swift 4 REPL / Playground, 12 bytes

Int.bitWidth

Inttiene el tamaño de una palabra, actúa como Int32o Int64dependiendo del sistema.

Alejandro
fuente
¿No es esto un código, así que debería imprimir? ¿O decir que está utilizando REPL evita esa restricción?
Lyndon White
1
Eso depende de los jueces. El uso de REPL no es muy común, pero Swift Playgrounds es muy popular (especialmente en iPad). Personalmente, creo que es un juego justo. La gente diseña lenguajes de programación personalizados para el golf que imprimen valores implícitamente, y esto no es diferente
Alexander
4

Rubí, 10 bytes

p 0.size*8

Si bien Ruby puede usar enteros de cualquier longitud, internamente almacena los valores que se ajustan a una palabra de máquina como Fixnum. El método Fixnum#sizesiempre devuelve la longitud en bytes de una palabra de máquina.

La Fixnumclase se eliminó en Ruby 2.4.0, su funcionalidad se incluyó en la clase Integer. El código se mantiene.

axiac
fuente
4

Shell, 26 bytes

uname -m|awk \$0=/_/?64:32
Steven Penny
fuente
Puedes usar en archlugar de uname -m.
Dennis
1
@ Dennis No necesariamente. En macos: uname -m-> x86_64, pero arch-> i386. Porque macos :( Además, esto es específico de bash - falla en zsh.
viraptor
@StevenPenny zshintentará interpretarlo ?como un comodín de carácter único / glob.
Pomo de la puerta
¿Funciona esto en Windows?
Ajasja
1
@Ajasja con Cygwin
Steven Penny
4

Bash, 25 17 bytes

getconf LONG_BIT

Gracias a Dennis por la ayuda en el golf.

John Nunley
fuente
4

C, 22 bytes

f(){return(int**)0+8;}

Esta es una respuesta basada en el tamaño del puntero que asume un binario nativo. El 0se envía a int**(dirección 0x0). Luego agregamos 8 a 0, que, en C avanza, el puntero por sizeof(int*)*8. 4 bytes * 8 bits = 32, 8 bytes * 8 bits = 64. Entonces obtenemos (int**)0x20y 0x40que luego se intconvierten implícitamente como enteros al devolverlos de una función de retorno implícito .

C, independiente, 34 bytes

main(){printf("%d\n",(int**)0+8);} 

C, divertido con Unicode, 30 puntos de código, 34 bytes (UTF-8)

main(){puts((int**)U" ㈳㐶"+1);}
Foo
fuente
He estado tratando de entender cómo funciona esto, pero no tengo ni idea. ¿Puedes agregar una explicación?
NieDzejkob
@jbcreix inteligente ...
NieDzejkob
3

Java, 50 bytes

int b(){return com.sun.jna.Native.POINTER_SIZE*8;}

Jeff I
fuente
¿Es eso una biblioteca? Si es así, ¡deberías mencionarlo! Sin embargo, no veo esa clase disponible en el JDK 8 de Oracle (no tengo mis JDK 6 y 7 habituales a mi disposición, cajero automático).
Olivier Grégoire
2
Esta respuesta no es válida No se imprime
Philipp
66
Citando a Dennis:> También dice que se aplican las reglas habituales de golf de código, y regresar de una función es parte de nuestros valores predeterminados para E / S.
Asu
Cámbielo a una función lamba por menos bytes:()->com.sun.jna.Native.POINTER_SIZE*8
Ferrybig
3

PHP, 29 bytes

<?=@php_uname(m)[-1]-4?32:64;

https://3v4l.org/Y6JXv

Petah
fuente
Oh. Me gusta este. ¿Como funciona?
tuskiomi
44
php_uname('m')regresa x86_64en un sistema operativo de 64 bits, de lo contrario, algo así i386. 4siendo el sexto personaje (5ª 0 indexado) de la cadena, '4' - 4 == 0 == false. Y @solo suprime las advertencias para cadenas sin comillas y compensaciones sin inicializar.
Petah
2
Esto detecta la arquitectura de PHP, no del sistema operativo. Estoy ejecutando PHP de 32 bits en un Windows de 64 bits, php_uname('m')vuelve 'i586'.
Gras Double
@GrasDouble bien, supongo ymmv, trabajo para mí Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64.
Petah
1
@tuskiomi, esto imprimirá 64 si hay un sistema operativo de 8 bits
Bja
3

Python 3 , 77 84 71 59 bytes

-13 bytes, gracias a @JonathanAllan!
Hasta 59 por @Clearer

from platform import*;print({'4':64,'6':32}[machine()[-1]])

Pruébalo en línea!

Mi primer código de golf:
debería mostrar la versión correcta incluso cuando se ejecuta 32Bit-Python en 64bit-OS.
Suponiendo que platform.machine()da i*86o x86para 32Bit-OS. No tengo uno disponible para verificar esto. La salida es 0cuando el sistema operativo no está en 64 / 32Bit
Edit: se agregó una declaración de impresión, por lo que tiene 7 bytes más

TOMA
fuente
No estoy seguro de si es aceptable porque es posible ejecutar un sistema operativo de 32 bits en una máquina de 64 bits (o tener una máquina llamada a foo86que sea de 64 bits: p), pero si es aceptable, puede guardar 9 (editar ... .13!) Bytes con print((a==64)*a+32*(a==86)).
Jonathan Allan
from platform import*;print({'4':64,'6':32}[machine()[-1]])funcionaría también
Más claro
@Clearer Esto pasaría por alto la siguiente restricción: Importante: imprima cualquier otra cadena no vacía de caracteres alfanuméricos si no tiene 32 o 64 bits. .
TOMA
@tOmAtE si no es ni de 32 ni de 64 bits, arrojará una excepción, que imprime una cadena no vacía.
Más claro
2
Pruebe arquitectura (), guarda el dict: from platform import*;print(architecture()[0][:2])-> 50 bytes
bugmenot123