Meu sistema operacional é de 32 ou 64 bits?

53

Não é mais tão importante, mas, ocasionalmente, alguém precisa saber.

Aqui está um exemplo simples: não tendo nenhuma entrada do usuário, diga-me se o computador no qual o código é executado está em um sistema operacional de 64 bits ou em um sistema operacional de 32 bits!

Se o código for executado em um sistema operacional de 32 bits, imprima "32"; se o código for executado em um sistema operacional de 64 bits, produza "64". Importante: imprima qualquer outra sequência não vazia de caracteres alfanuméricos se não tiver 32 ou 64 bits.

Observe que um programa de 32 bits em execução em um computador com sistema operacional de 64 bits deve gerar "64". Você pode assumir que os usuários usarão software de 64 bits sempre que possível.

Para se qualificar para a entrada, seu código deve ser capaz de executar nos sistemas Windows 4.10 ou mais recentes suportados pela Microsoft e pelo menos um tipo de Linux de sua escolha (desde que esse tipo seja gratuito). Mods de compatibilidade podem ser instalados, desde que o programa ainda retorne o valor correto.

Aplicam-se as regras usuais de .

Nota: Se a sua resposta tiver apenas a intenção de imprimir 32 ou 64, mas não o caso alt, aceitarei, mas não é uma resposta concorrente.

Vou tentar publicar alguns resultados da execução desses códigos em diferentes sistemas operacionais mais tarde!

tuskiomi
fonte
5
Portanto, "Observe que um programa de 32 bits em execução em um computador com sistema operacional de 64 bits deve gerar" 64 ". Você pode assumir que os usuários usarão o software de 64 bits sempre que possível." significa que, se o interpretador / compilador etc estiver disponível em 32 e 64 bits, um sistema operacional de 32 bits sempre executará a versão de 32 bits do interpretador / etc, e o sistema operacional de 64 bits sempre executará o interpretador de 64 bits / etc. Portanto, preocupar-se com a diferença entre o programa ser 32 ou 64 e o SO ser 32 ou 64 é basicamente apenas um problema para idiomas com implementações de apenas 32 bits. Direito?
Lyndon Branca
2
Muitas soluções aqui imprimiam "32" em um sistema operacional de 64 bits se um compilador de 32 bits fosse usado para compilar o programa. Isso está bom?
Martin Rosenau
15
O que no mundo é "Windows 4.10"? Isso significa Windows 98? Ou isso significa Windows NT 4? O que você considera mais "novo" que isso? Este parece um desafio excepcionalmente mal pensado.
Cody Grey
13
Não há "especificação oficial do Windows" e ninguém se refere ao Windows 98 como sendo "Windows 4.10". Você é literalmente o primeiro. Então, talvez, em vez de tentar parecer legal ou oficial usando números de versão, você deva usar apenas o nome real do produto . A propósito, o Windows 9x nunca estava disponível em uma compilação de 64 bits, então é realmente legítimo para mim enviar uma entrada que seja executada apenas no Windows 98 e retorne apenas "32"? Parece muito injusto / antidesportivo / desinteressante, mas seria tecnicamente permitido por suas regras.
Cody Grey
3
Você ainda não respondeu à pergunta sobre a versão do Windows. Será que deve ser capaz de rodar em Windows 4.10 ou mais recente média no Windows 4.10 e todas as versões mais recentes ou em um único Windows versão, 4,10 ou mais recente ?
Dennis

Respostas:

44

Montagem x86 (poliglota), 13 bytes

Bytecode:

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

Define uma função que retorna 32 se interpretada como 32 bits, 64 se 64 bits e 32767 se 16 bits.

Eu queria criar um poliglota que rodasse no Windows e Linux, mas isso é muito mais difícil do que eu pensava. Como é, não tenho certeza de que exista alguma maneira de imprimir um valor no Windows que não seja de 16 bits sem vincular.

Explicação

Este código usa duas instruções para determinar a arquitetura em que está sendo executado. A primeira é a instrução 0x48 - em 16 e 32 bits dec %eax, mas em 64 bits, é um prefixo do tamanho da instrução. A segunda indicação é a mesma instrução, no entanto, quando a executamos no valor 0x8000, o bit mais significativo é invertido apenas se o tamanho do registro for 16 bits, configurando o sinalizador de estouro e nos permitindo usar jo.

Em 16 bits, esse código é interpretado da seguinte maneira:

   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 */

Em 32 bits, esse código é interpretado da seguinte maneira:

   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

Em 64 bits, esse código é interpretado da seguinte maneira:

   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
fonte
Isso provavelmente está na liderança, muito bom
tuskiomi
11
Uma idéia muito interessante, mas conforme implementada, isso retornará o valor errado se montado como um binário de 32 bits e executado em um sistema operacional de 64 bits.
Cody Grey
@CodyGray das regras: Você pode assumir que os usuários usarão o software de 64 bits sempre que possível. Suponho que isso também significa que, para funções, podemos assumir que o código do chamador é de 64 bits sempre que possível.
Ruslan
Ah, suponho que seja uma interpretação justa, @Ruslan. E vejo que você já postou a resposta que eu tinha em mente , não fosse esse problema. :-) Você recebeu meu voto positivo.
Cody Grey
o byte 48representa dec %eaxno 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

Ungolfed:

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 função funciona no Linux quando usado no ELF32, seguindo o i386 SysV ABI, bem como no Windows / Wine quando usado no PE32, seguindo a stdcallconvenção de chamada.

Ruslan
fonte
Na verdade, é possível reduzir ainda mais a contagem de bytes se seguir outra abordagem .
Ruslan
o que isso faria teoricamente em um ambiente não de 32/64 bits?
tuskiomi
11
@tuskiomi De qualquer forma, esse código ainda retornará 32 ou 64. A única diferença de interpretação dessa sequência de bytes no modo de 16 bits será uma alteração dos mnemônicos de eaxpara ax. Então, se o selector na cspassa a ser 0x23, o resultado será 64, caso contrário, 32.
Ruslan
isso parece específico para dois sistemas operacionais específicos. Você poderia facilmente ter um sistema de 32 bits com cs = 0x23. Veja, em vez disso, minha resposta de 8 bytes que tem como alvo a CPU.
peter ferrie
@ Peterferrie Sim, é por isso que tenho outra resposta . Mas o seu supera em 2 bytes.
Ruslan #
32

Mathematica, 17 bytes

$SystemWordLength
J42161217
fonte
13
Claro que há um builtin! \ s (+1)
tuskiomi
Você não deve adicionar &ou especificar que isso está no REPL?
precisa
5
@ LegionMammal978 "Se o código for executado em um sistema operacional de 32 bits, imprima" 32 ", se o código for executado em um sistema operacional de 64 bits, emita" 64 ". Imprima qualquer (outra) sequência não vazia de caracteres alfanuméricos se não for nenhum. " Não "fornece uma função que, quando executada, faz isso"; apenas "faça isso".
Patrick Stevens
17
@PatrickStevens: se a pergunta não especificar qual formulário um envio deve ser, é um programa ou função, mas não um trecho, por padrão .
3
@ ais523 Eu diria que não há distinção no Mathematica entre programas, funções e snippets. Tudo é apenas uma expressão.
Ngenisis
21

Carregadores de inicialização

Você sabia que o GRUB e o IPXE possuem linguagens de programação completas de Turing acessíveis em tempo de execução? A família Syslinux de gerenciadores de inicialização não, mas eles podem fazer isso.

IPXE, 36 bytes

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

a primeira linha é necessária se o script for executado remotamente, mas não se digitado diretamente na linha de comando.

GRUB, 42 bytes

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

Syslinux, 186 bytes

São necessários três arquivos, o primeiro é o syslinux.cfg (ou 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

e t.cfg

menu title 32

ans s.cfg

menu title 64

Para este, a parte mais difícil é que o syslinux não possui recursos simples de exibição de texto; portanto, o menu é abusado.

hildred
fonte
Eu não tenho certeza se você pode dizer a resolução OS com um carregador de inicialização, mas eu gosto da idéia
tuskiomi
Ele verifica o processador e é usado para selecionar o sistema operacional correto. Este é basicamente o código do meu projeto de inicialização.
Hildred
2
Então isso muda o sistema operacional com base na arquitetura. Pensando fora da caixa. Eu gosto.
tuskiomi
Qual é o número de bytes?
Restioson
11
@hildred Eu acredito que seria mais legível se você usou ## iPXE, 36 bytesem vez de### ipxe 36
NieDzejkob
21

Julia 14 13 bytes

n->8sizeof(1)

Explicar:

  • Função Anon, recebendo qualquer coisa (inclusive nothing) retornando um número inteiro 32 ou 64
  • Literais inteiros são do tipo Intque, dependendo de 32 ou 64 bits, é um Int32ou um Int64( 1pode ser qualquer dígito)
  • colocar um número antes de uma chamada de função fazer uma multiplicação de justaposição
  • Esta é basicamente uma versão minificada do códigoSys.WORD_SIZE usada na resposta de rahnema1

Outra resposta divertida é ()->"$(Int)"[4:5], mas não consigo contar a contagem.


-1 graças a @Roman Gräf

Lyndon White
fonte
Você pode usar um argumento fictício: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf
19

julia, 20 17 16 bytes

n->Sys.WORD_SIZE

* Graças a @LyndonWhite salvou 3 bytes * Graças a @ RomanGräf salvou um byte

Respostas anteriores:

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

Experimente online!

rahnema1
fonte
11
Eu, pessoalmente, gosto deste!
tuskiomi
2
Por convenção seguinte: codegolf.meta.stackexchange.com/q/2419/62131 você pode raspar 3 bytes fazendo()->Sys.WORD_SIZE
Lyndon Branca
11
Você também pode usar um argumento fictício: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf
14

JavaScript (Node.js), 24 bytes

_=>process.arch.slice(1)

Esta é uma função e retorna '32', '64'ou, se nenhuma 'rm'.

Downgoat
fonte
+1, mas suponho que um arco de 64 bits pode estar executando um sistema operacional de 32 bits embora
Octopus
11
Dá-me '32' no Windows de 32 bits, para que pareça funcionar.
Ken YN
5
Você pode raspar 7 bytes se você estiver usando o REPL e osem vez de process:os.arch().slice(1)
GilZ
Isso retorna a arquitetura do sistema operacional relatada ao processo, não a arquitetura real do sistema operacional. Portanto, isso não funciona no Linux. (Punch "setarch" em seu mecanismo de busca favorito.)
David Schwartz
@DavidSchwartz ele funciona bem na minha caixa de linux a menos que eu estou mal-entendido, mas em PPCG podemos supor um ambiente sem modificações em termos de usuário mudando o arco
Downgoat
13

C, 33 31 29 23 bytes

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

Obrigado aos comentadores @ceilingcat e @Dennis pelas dicas de golfe!

Govind Parmar
fonte
13
Ele também diz que as regras usuais de código de golfe se aplicam e o retorno de uma função faz parte dos nossos padrões de E / S.
Dennis
11
Isso não vai depender se você compila como um programa de 32 ou 64 bits?
precisa
4
Isso não está de acordo com os requisitos. " Observe que um programa de 32 bits em execução em um computador com sistema operacional de 64 bits deve gerar" 64 ". " Isso informa como o programa foi compilado, e não o que é o sistema operacional.
David Schwartz
2
@DavidSchwartz "Você pode assumir que os usuários usarão software de 64 bits sempre que possível."
Klas Lindbäck
2
Desculpe dizer isso, mas sizeof é avaliado em tempo de compilação. Portanto, se você compilar um exe de 32 bits e executá-lo em uma máquina de 64 bits, ele produzirá 32 enquanto deve gerar 64 ( stackoverflow.com/questions/2615203/… ). Boa ideia embora!
Dinaiz
11

PowerShell, 16 bytes

8*[IntPtr]::Size

Obtém o tamanho do ponteiro em bytes, multiplica por 8 para obter bits.

Chirishman
fonte
-1 porqueyour code must be able to run on Windows 4.10 or newer
ub3rst4r
11
@ ub3rst4r ou mais recente, não e mais recente. Estou disposto a apostar que uma boa parte dessas respostas é difícil, na melhor das hipóteses, para ser executada em uma versão longa e sem suporte do Windows. Também não é razoável esperar que as pessoas testem em 98 de todos os sistemas operacionais - nem sequer é fácil de instalar em uma VM hoje em dia (acredite em mim, eu tentei. Não vou rodar no KVM e tem interações interessantes com os adaptadores de vídeo VBox) . (Nem mesmo tem um conceito de 64 bits ... isso é uma exigência verdadeiramente ridículo.)
Bob
11
@ ub3rst4r Duvido que todas as linguagens de programação interpretadas aqui tenham uma implementação funcionando no Windows 4.10!
Martin Rosenau
11
Parece que falhará se for um PowerShell de 32 bits em um sistema operacional de 64 bits.
Chris J
@ChrisJ Pelo menos no Win10 e Win2012 R2, ele retorna o resultado adequado do x86 PowerShell. Não testei no Linux.
precisa
10

Python 2, 52, 48, 42 41 bytes

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

Graças a totalmente humano!

Daniel
fonte
ampliação! do outro lado da linha em menos de um minuto.
tuskiomi
Vou adiar o teste até chegar em casa, mas não tenho certeza de que isso imprima "32" e "64", mas em outros casos estou confiante.
tuskiomi
@tuskiomi, este imprime "32 bits" ou "64 bits"
Daniel
11
from struct import*;print calcsize("P")*8é mais curto.
totallyhuman
12
Se você executar isso no Python de 32 bits em um sistema operacional de 64 bits, acho que isso será uma mentira para você. A maioria das outras respostas também parecem sensível a isso de qualquer maneira ...
Nick T
10

Java 8, 45 bytes

()->System.getProperty("sun.arch.data.model")
Daniel
fonte
@Dopapp O que ele quer dizer é que esse é um trecho, não um programa ou função. No Java 8, isso deve funcionar:n=>System.getProperty("os.arch")
NoOneIsHere
@NoOneIsHere, oh obrigado que entrou maneira sobre a minha cabeça
Daniel
2
"Se o código for executado em um sistema operacional de 32 bits, imprima" 32 ", se o código for executado em um sistema operacional de 64 bits, imprima" 64 ". Imprima qualquer (outra) sequência não vazia de caracteres alfanuméricos, se for nem.". Isso não faz nada disso ...
Olivier Grégoire
4
Você pode obter o Java 8 para Windows 98 (v4.10)?
usar o seguinte
4
@TessellatingHeckler O Java 8 requer "i586" (o que isso significa). A entrada diz: "seu código deve ser capaz de executar no Windows 4.10 ou mais recente", não "seu código deve ser capaz de executar no Windows 4.10 e mais recente". Ele roda em um Windows mais recente .
Olivier Grégoire
9

Perl 6 , 17 bytes

say $*KERNEL.bits

Tente


Existe um relacionado $?BITSque contém o número de bits que um nativo intpossui no tempo de execução.

say $?BITS

Tente

Brad Gilbert b2gills
fonte
8

Windows CMD, 56 52 bytes (obrigado Bob!)

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

Ainda surpreendentemente demorado - o mais longo até agora!

Ken YN
fonte
11
Na verdade, %windir%\SysWOW64é ainda mais curto, eu acho ...
Bob
7
" deve ser capaz de rodar no Windows 4.10 ou mais recente, e pelo menos um sabor do Linux de sua escolha " - qual sabor do Linux para isso?
usar o seguinte
11
@TessellatingHeckler se você instalar o Wine ...?
Ken YN
11
Que tal usar taquigrafia? if EXIST "c:\Progra~3" (echo 64)else echo 32Por padrão, você tem ProgramDatae Program Filespor isso, se um terceiro existe, devemos ser 64
Marie
3
O que isso imprimirá para um sistema operacional de 8 bits?
precisa saber é o seguinte
7

C, API Win32, 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;}

Na verdade, existem mais de 2 casos aqui. Vamos examiná-los

  • O mais fácil: IsWow64Processnão existe: estamos em um sistema operacional de 32 bits

Para os próximos dois casos, precisamos ter o conhecimento de que nosso binário será um executável de 32 bits. E essa descrição do que será exibido no parâmetro out deIsWow64Process

Um ponteiro para um valor definido como TRUE se o processo estiver sendo executado no WOW64. Se o processo estiver sendo executado no Windows de 32 bits, o valor será definido como FALSE. Se o processo for um aplicativo de 64 bits em execução no Windows de 64 bits, o valor também será definido como FALSE.

Isso nos deixa com dois casos adicionais:

  • IsWow64Process existe e gera VERDADEIRO -> Estamos em uma máquina de 64 bits
  • IsWow64Process existe e gera FALSE -> Estamos em uma máquina de 32 bits

Não nos preocupamos com a parte em que um aplicativo de 64 bits no Windows de 64 bits gera FALSE. Como sabemos que nosso aplicativo é de 32 bits

Ah, e há um caso adicional que não é coberto por esse desafio e deve ser raro de qualquer maneira:

  • IsWow64Process existe, mas falha: O padrão é a máquina de 32 bits.

Isso deve abranger a maioria dos sistemas operacionais Windows NT. Foram testados apenas no Win10 de 64 bits, no Win 7 de 64 bits, no Win 8.1 de 32 bits e no WinXP SP1 de 32 bits


Resposta original:

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

Para ter certeza, precisamos distinguir apenas 2 casos

  • IsWow64Process não existe no kernel32.dll => Estamos em uma máquina de 32 bits.

  • IsWow64Process existe => Estamos em uma máquina de 64 bits.

O valor real fornecido por IsWow64Processé irrelevante para esse desafio, pois queremos que o binário seja de 32 bits em qualquer caso.

Ao contrário da maioria das respostas, isso não depende do próprio binário sendo compilado na máquina em que é executado.

Se eu conhecesse uma função mais curta que está presente apenas em máquinas de 64 bits e não de 32 bits, poderia reduzir a resposta.

MrPaulch
fonte
2
Solte o .dllda cadeia de nome do módulo. Isso não só é bom para o golfe, como também é uma prática melhor no uso normal. Além disso, para fins de golfe, você pode deixar o espaço depois #include.
Cody Gray
Obrigado, eu realmente queria reduzir tudo, procurando apenas um módulo que pode ser encontrado em 64 bits, mas não em 32 bits. Eu ainda estou olhando. Infelizmente (para esse fim) não existe um módulo chamado WoW64.
MrPaulch
Na verdade, existe um wow64.dlle Wow64Win.dll, mas nunca tentei ligar GetModuleHandlecom eles. O problema, porém, é que eles seriam carregados apenas para um processo de 32 bits em execução em uma máquina de 64 bits, não para um processo de 64 bits em execução em uma máquina de 64 bits.
Cody Grey
Eu tenho. Eles retornam 0 mesmo em uma máquina de 64 bits. Faz sentido, na verdade. Eles não existem para serem vinculados diretamente. O sistema cuida do redirecionamento durante o tempo de execução.
MrPaulch
Ooh, problema embora. Na documentação do SDK: "Observe que essa técnica não é uma maneira confiável de detectar se o sistema operacional é uma versão de 64 bits do Windows porque o Kernel32.dll nas versões atuais do Windows de 32 bits também contém essa função".
Cody Grey
7

C #, 60 50 bytes

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

Obrigado @TheLethalCoder

kakkarot
fonte
11
Bem vindo ao site! :)
DJMcMayhem
4
Salve 4 bytes se você remover 'Line'
John
11
também pode remover 'Ambiente'. e 'console'. assumindo o uso de using static System.Environment;eusing static System.Console;
John
11
também, mude WriteLineparaWrite
Thomas Ayoub
7
@ John última vez que verifiquei, as importações devem ser incluídos e assim aumentaria a contagem de bytes
Ceshion
6

Ruby, 22 bytes

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

["any string"].pack("p")retorna uma cadeia de caracteres cujos bytes correspondem ao ponteiro apontado para "any string"e possui 8 caracteres se o sistema operacional for de 64 bits ou 4 caracteres se o sistema operacional for de 32 bits.

Value Ink
fonte
Como isso está usando o tamanho do ponteiro, isso será impresso em 32 bits quando o interpretador Ruby for um binário de 32 bits em um sistema operacional de 64 bits. Então erra uma regra.
DarkDust
11
@DDarkust You can assume that users will use 64 bit software whenever possible.Então, supõe -se que os usuários de 64 bits estejam executando o Ruby de 64 bits.
Value Ink
6

R, 16 bytes

.Machine[[18]]*8

Retorna o tamanho do ponteiro.

Sven Hohenstein
fonte
11
Como todas as soluções de tamanho de ponteiro, isso imprimirá o resultado errado quando o programa for um binário de 32 bits em execução em um sistema operacional de 64 bits.
DarkDust
11
O @DarkDust R é interpretado, e podemos assumir que o usuário usa software de 64 bits sempre que possível, assim como um intérprete de 64 bits. IMHO, a regra só se aplica a linguagens compiladas
NieDzejkob
@NieDzejkob Essa é exatamente a mesma lógica que usei para minha resposta em PHP quando alguém colocar o mesmo tipo de comentário em resposta à minha resposta. Desejo que outras pessoas leiam o mesmo da pergunta que temos ao assumir que os usuários usarão 64- sempre que possível com linguagens interpretadas.
BJA
6

Perl, 18 15 18 bytes

say length pack p8
Grimmy
fonte
Eu entro 64␤no meu computador de 32 bits, porque perlfoi construído com um IV de 64 bits. Você verá que esse geralmente é o caso ao executar na versão de 32 bits do Windows.
Brad Gilbert b2gills
@ BradGilbertb2gills Reverti o código para a versão anterior; este deve funcionar mesmo neste caso. Deixe-me saber se ainda não funcionar, vou excluir minha resposta.
Grimmy
11
Isso funciona corretamente.
Brad Gilbert b2gills
Parece errado na HP 9000/785. Dá 32. Mas não acho que existam 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

Ungolfed:

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

Se compilado como um executável de 64 bits, ele retornará 64 pol eaxe, se compilado como 32 bits, retornará 32 - independentemente do sistema operacional.

Esta resposta se baseia nas regras que dizem:

Você pode assumir que os usuários usarão software de 64 bits sempre que possível.

Ruslan
fonte
Embora essa seja uma abordagem interessante, como ela pode ser gravada em um programa de forma que possa realmente ser executada? Todo método que eu consigo pensar em executar código binário que não seja escrever sua própria função de carregador usa arquivos específicos para código de 64 ou 32 bits. Portanto, você vai precisar de duas cópias deste código, a fim de realmente correr ...
Jules
@Jules Você pode colocá-lo como montagem embutida em um programa de linguagem de alto nível, como aqui . Então você só precisa usar o compilador nativo da plataforma com suas opções padrão e obterá o testemunho.
Ruslan
@ l4m2 por que você grita comigo? Mas você está certo, de qualquer maneira, esses dois bytes parecem ser algum lixo deixado pelas minhas experiências. Vai remover.
Ruslan
5

PHP, 18 bytes

<?=PHP_INT_SIZE*8;

Isso lida corretamente com todos os casos de CPUs de 32, 64 e outros bits, desde que PHP_INT_SIZE esteja correto, mostrando o tamanho preciso da CPU, independentemente da CPU em que a PHP esteja sendo executada!

Se o PHP estiver sendo executado em

SO PHP_INT_SIZE == 4 de 32 bits,

SO de 64 bits PHP_INT_SIZE == 8,

SO de 16 bits PHP_INT_SIZE == 2 (teoricamente)

SO de 8 bits PHP_INT_SIZE == 1 (novamente teoricamente)

SO de 128 bits PHP_INT_SIZE == 16 (Ainda não foi alcançado, mas é possível)

Bja
fonte
2
essa constante tem o tamanho do sistema operacional onde o PHP foi construído, não correr
Einacio
2
@Einacio Sim, mas no desafio inicial, o pôster escreveu "Você pode assumir que os usuários usarão o software de 64 bits sempre que possível". Portanto, se o sistema operacional for de 64 bits, a versão do PHP em execução no sistema operacional deverá ser assumida como seja de 64 bits! (Nota: eu não vejo isso como uma brecha apenas pura lógica baseado fora do desafio inicial.)
BJA
4

C # (29 bytes)

Console.Write(IntPtr.Size*8);
James B
fonte
10
Como todas as soluções de tamanho de ponteiro, isso imprimirá o resultado errado quando o programa for um binário de 32 bits em execução em um sistema operacional de 64 bits.
DarkDust
11
É necessário especificar que isso seja compilado para "AnyCPU" com a caixa de seleção "Preferir 32 bits" desmarcada.
Cody Gray
4

PowerShell, 17 52 bytes

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

Retorna 64 se um dos seguintes for verdadeiro:

  • Você tem um diretório em sua unidade atual com um nome de arquivo que termina em uma parêntese, a idéia é detectar Program Files (x86).
  • archretorna uma string terminada em 4(ASCII 52), como x86_64, ao contrário de por exemplo i686.

O try-catch visa contornar o erro que você obtém se gci não retornar nada e você não tiver um arco . Eu não encontrei uma maneira mais curta de fazê-lo até agora. gci é usado sobre ls porque no Linux, ls produzirá um erro visível.

Esta versão deve detectar se o sistema operacional é de 64 bits e não apenas o PowerShell, e foi testado para funcionar no Windows e Linux. Para suporte ao Mac, substitua archpor uname -m.

Versão anterior apenas para Windows: -!(ls \*`))*32+64

Andy C.
fonte
em que distro do linux isso funciona?
tuskiomi
@ tuskiomi Oh, meu mal - entendo o que você quer dizer. Não leu o desafio corretamente. Devo excluir a resposta?
Andy C.
Se você sabe que funcionará com o WINE, mantenha-o.
tuskiomi
@tuskiomi No mínimo Ubuntu 14.04, 16.04, RHEL7, CentOS7 e alguma versão do SUSE: github.com/PowerShell/PowerShell/releases
Xudonax
4

Swift 4 REPL / Parque infantil, 12 bytes

Int.bitWidth

Inttem tamanho de palavra, agindo como um Int32ou Int64dependendo do sistema.

Alexander
fonte
Isso não é um código, então ele deve ser impresso? Ou dizer que você está usando o REPL contorna essa restrição?
Lyndon Branca
11
Isso depende dos juízes. O uso do REPL não é muito comum, mas o Swift Playgrounds é muito popular (especialmente no iPad). Pessoalmente, acho que é um jogo justo. Pessoas design personalizado linguagens de programação para o golfe que imprimir implicitamente valores, e isso não é diferente
Alexander
4

Ruby, 10 bytes

p 0.size*8

Enquanto Ruby pode usar números inteiros de qualquer tamanho, internamente ele armazena os valores que cabem em uma palavra de máquina como Fixnum. O método Fixnum#sizesempre retorna o comprimento em bytes de uma palavra de máquina.

A Fixnumclasse foi removida no Ruby 2.4.0, sua funcionalidade foi incluída na classe Integer. O código permanece.

axiac
fonte
4

Shell, 26 bytes

uname -m|awk \$0=/_/?64:32
Steven Penny
fonte
Você pode usar em archvez de uname -m.
Dennis
11
@ Dennis Não necessariamente. Nos macos: uname -m-> x86_64, mas arch-> i386. Porque macos :( Além disso, isso é específico do bash - falha no zsh.
viraptor 20/17
O @StevenPenny zshtentará interpretar o ?caractere curinga como um caractere glob / único.
Maçaneta da porta
Isso funciona no Windows?
Ajasja
11
@Ajasja com Cygwin
Steven Penny
4

Bash, 25 17 bytes

getconf LONG_BIT

Agradecimentos a Dennis pela ajuda no golfe.

John Nunley
fonte
4

C, 22 bytes

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

Esta é uma resposta baseada no tamanho do ponteiro que assume um binário nativo. O 0é convertido para int**(endereço 0x0). Em seguida, adicionamos 8 a 0, que, em C, avança, o ponteiro por sizeof(int*)*8. 4 bytes * 8 bits = 32, 8 bytes * 8 bits = 64. Então, obtemos (int**)0x20e 0x40que são convertidos implicitamente como números inteiros, retornando-os de uma intfunção de retorno implícito .

C, autônomo, 34 bytes

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

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

main(){puts((int**)U" ㈳㐶"+1);}
Foo
fonte
Eu tenho tentado entender como isso funciona, mas eu não tenho noção. Você pode adicionar uma explicação?
Njdzejkob
@jbcreix clever ...
NieDzejkob
3

Java, 50 bytes

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

Jeff I
fonte
Isso é uma biblioteca? Se sim, você deve mencionar! Porém, não vejo essa classe disponível no JDK 8 do Oracle (não tenho meu JDK 6 e 7 habitual à minha disposição, atm).
Olivier Grégoire
2
Esta resposta é inválida. Não imprime.
Philipp
6
Citando Dennis:> Ele também diz que as regras usuais de código de golfe se aplicam e o retorno de uma função faz parte de nossos padrões de E / S.
Asu
Altere-o para uma função 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
fonte
Ooh. Eu gosto deste. Como funciona?
tuskiomi
4
php_uname('m')retorna x86_64em um sistema operacional de 64 bits, caso contrário, algo como i386. 4sendo o sexto caractere (quinto 0 indexado) da string '4' - 4 == 0 == false,. E @apenas suprime avisos para cadeias não citadas e compensações não inicializadas.
Petah
2
Isso detecta a arquitetura do PHP, não do sistema operacional. Estou executando o PHP de 32 bits em um Windows de 64 bits, php_uname('m')retorna 'i586'.
Gras Double
@GrasDouble bem, eu acho que sim, eu trabalho para mim Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64.
Petah
11
@tuskiomi isso irá imprimir 64 se houver um sistema de 8-bit operacional
BJA
3

Python 3 , 77 84 71 59 bytes

-13 bytes, graças a @ Jonathanon Allan!
Até 59 por @Clearer

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

Experimente online!

Meu primeiro código de golfe :)
Deve produzir a versão correta, mesmo ao executar 32Bit-Python no sistema operacional de 64 bits.
Supondo que você platform.machine()fornece i*86ou x86para 32Bit-OS. Não tenho um disponível para verificar isso. A saída ocorre 0quando o SO não está no 64 / 32Bit
Edit: Adicionada instrução de impressão, por isso possui 7 bytes a mais

tomO
fonte
Não tenho certeza se é aceitável porque é possível executar um sistema operacional de 32 bits em uma máquina de 64 bits (ou ter uma máquina chamada de foo8664 bits: p), mas se for aceitável, você poderá salvar 9 (editar .. .13!) Bytes com print((a==64)*a+32*(a==86)).
Jonathan Allan
from platform import*;print({'4':64,'6':32}[machine()[-1]])funcionaria também.
Clearer
@Clearer Isso não apresentaria as seguintes restrições: Importante: imprima qualquer outra sequência não vazia de caracteres alfanuméricos, se não tiver 32 ou 64 bits. .
Tomate
@tOmAtE, se não tiver 32 nem 64 bits, lançará uma exceção, que imprime uma string não vazia.
Clear
2
Tente arquitetura (), salva o dict: from platform import*;print(architecture()[0][:2])-> 50 bytes
bugmenot123