Il mio sistema operativo è a 32 o 64 bit?


53

Non è più troppo importante, ma a volte qualcuno deve saperlo.

Ecco un semplice golf: Non prendere input da parte dell'utente, dimmi se il computer su cui viene eseguito il codice si trova su un sistema operativo a 64 bit o su un sistema operativo a 32 bit!

Se il codice viene eseguito su un sistema operativo a 32 bit, stampare "32", se il codice viene eseguito su un sistema operativo a 64 bit, produrre "64". Importante: stampare qualsiasi altra stringa non vuota di caratteri alfanumerici se non è a 32 o 64 bit.

Si noti che un programma a 32 bit in esecuzione su un computer con un sistema operativo a 64 bit dovrebbe generare "64". Puoi presumere che gli utenti useranno software a 64 bit ogni volta che sarà possibile.

Per essere idoneo per l'ingresso, il tuo codice deve essere in grado di funzionare su Windows 4.10 o su sistemi Windows supportati da Microsoft più recenti e almeno un sapore di Linux di tua scelta (purché tale sapore sia gratuito). Le mod di compatibilità possono essere installate, purché il programma restituisca ancora il valore corretto.

Si applicano le solite regole del .

Nota: se la tua risposta è destinata solo a stampare 32 o 64, ma non il caso alt, lo accetterò, ma non è una risposta concorrente.

Proverò a pubblicare alcuni risultati dell'esecuzione di questi codici su diversi sistemi operativi in ​​seguito!


5
Quindi "Si noti che un programma a 32 bit in esecuzione su un computer con un sistema operativo a 64 bit dovrebbe generare" 64 ". Si può presumere che gli utenti utilizzeranno il software a 64 bit quando possibile." significa che se l'interprete / compilatore ecc. è disponibile sia a 32 bit che a 64 bit, quindi un sistema operativo a 32 bit, eseguirà sempre la versione a 32 bit dell'interprete / ecc. e il sistema operativo a 64 bit eseguirà sempre l'interprete a 64 bit /eccetera. Quindi preoccuparsi della differenza tra il programma 32 o 64 e il sistema operativo 32 o 64, è fondamentalmente solo un problema per le lingue con implementazioni a soli 32 bit. Giusto?
Lyndon White,

2
Molte soluzioni qui stamperebbero "32" su un sistema operativo a 64 bit se un compilatore a 32 bit fosse utilizzato per compilare il programma. Va bene?
Martin Rosenau,

15
Cosa nel mondo è "Windows 4.10"? Significa Windows 98? O significa Windows NT 4? Cosa consideri "più nuovo" di così? Questa sembra una sfida eccezionalmente mal pensata.
Cody Grey,

13
Non esiste una "specifica ufficiale di Windows" e nessuno si riferisce a Windows 98 come "Windows 4.10". Sei letteralmente il primo. Quindi forse invece di provare a sembrare cool o ufficiale usando i numeri di versione, dovresti semplicemente usare il nome del prodotto reale . A proposito, Windows 9x non è mai stato disponibile in una build a 64 bit, quindi è in realtà legittimo per me inviare una voce che funziona solo su Windows 98 e restituisce semplicemente "32"? Sembra molto ingiusto / antisportivo / poco interessante, ma tecnicamente sarebbe consentito dalle tue regole.
Cody Gray,

3
Non hai ancora risposto alla domanda sulla versione di Windows. Non deve essere in grado di funzionare su Windows 4.10 o più recente media su Windows 4.10 e tutte le versioni più recenti o su una singola versione di Windows, 4.10 o più recente ?
Dennis,

Risposte:


44

x86 Assembly (poliglotta), 13 byte

bytecode:

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

Definisce una funzione che restituisce 32 se interpretata come 32-bit, 64 se 64-bit e 32767 se 16-bit.

Volevo realizzare un poliglotta che funzionasse su Windows e Linux, ma è molto più difficile di quanto pensassi. Dato che non sono sicuro che esista un modo per stampare un valore su Windows non a 16 bit senza collegamento.

Spiegazione

Questo codice utilizza due tell per determinare l'architettura su cui è in esecuzione. Il primo è l'istruzione 0x48: su 16 e 32 bit, questo è dec %eax, ma su 64 bit, è un prefisso della dimensione dell'istruzione. Il secondo tell è la stessa istruzione, tuttavia, quando lo eseguiamo sul valore 0x8000, il bit più significativo viene invertito solo se la dimensione del registro è di 16 bit, impostando il flag di overflow e permettendoci di usarlo jo.

A 16 bit, questo codice viene interpretato come segue:

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

A 32 bit, questo codice viene interpretato come segue:

   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

A 64 bit, questo codice viene interpretato come segue:

   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

Questo in realtà è probabilmente in testa, molto bello
tuskiomi il

1
Un'idea molto chiara, ma se implementata, questo restituirà il valore errato se assemblato come binario a 32 bit ed eseguito su un sistema operativo a 64 bit.
Cody Grey,

@CodyGray dalle regole: puoi presumere che gli utenti useranno software a 64 bit ogni volta che sarà possibile. Suppongo che ciò significhi anche che per le funzioni possiamo supporre che il codice chiamante sia a 64 bit quando possibile.
Ruslan,

Ah, suppongo sia una buona interpretazione, @Ruslan. E vedo che hai già pubblicato la risposta che avevo in mente , se non fosse per questo problema. :-) Hai il mio voto.
Cody Gray il

il byte 48rappresenta dec %eaxin modalità 16 bit?
phuclv,

48

codice macchina x86, 12 byte

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

Questa funzione è attiva in Linux se utilizzata in ELF32, seguendo l'iI6 SysV ABI, così come in Windows / Wine se utilizzata in PE32, seguendo la stdcallconvenzione di chiamata.


In realtà si può ridurre ulteriormente il conteggio dei byte se si segue un altro approccio .
Ruslan,

cosa farebbe teoricamente in un ambiente non a 32/64 bit?
tuskiomi,

1
@tuskiomi In ogni caso, questo codice restituirà comunque 32 o 64. L'unica differenza nell'interpretazione di questa sequenza di byte in modalità 16 bit sarà un cambiamento di mnemonica da eaxa ax. Quindi, se il selettore csè 0x23, il risultato sarà 64, altrimenti 32.
Ruslan,

questo sembra specifico a due particolari sistemi operativi, però. Si potrebbe facilmente avere un sistema a 32 bit con cs = 0x23. Vedi invece la mia risposta a 8 byte che punta invece alla CPU.
Peter Ferrie,

@peterferrie sì, ecco perché ho un'altra risposta . Ma il tuo lo supera di 2 byte.
Ruslan,

32

Mathematica, 17 byte

$SystemWordLength

13
Ovviamente c'è un builtin! \ s (+1)
tuskiomi il

Non dovresti aggiungere &o specificare che questo è nel REPL?
LegionMammal978,

5
@ LegionMammal978 "Se il codice viene eseguito su un sistema operativo a 32 bit, stampa" 32 ", se il codice viene eseguito su un sistema operativo a 64 bit, genera" 64 ". Stampa qualsiasi stringa (non) vuota di caratteri alfanumerici se non è nessuno dei due ". Non "fornire una funzione che, quando eseguita, fa questo"; "fai questo".
Patrick Stevens,

17
@PatrickStevens: se la domanda non specifica quale forma deve essere inviata da un invio, è un programma o una funzione, ma non uno snippet, per impostazione predefinita .

3
@ ais523 Direi che non c'è distinzione in Mathematica tra programmi, funzioni e frammenti. Tutto è solo un'espressione.
ngenisis,

21

Caricatori di avvio

Sapevi che GRUB e IPXE hanno entrambi i linguaggi di programmazione completi Turing accessibili in fase di esecuzione? La famiglia di boot loader Syslinux non lo fa, ma può farlo.

IPXE, 36 byte

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

la prima riga è necessaria se lo script viene eseguito in remoto, ma non se digitato direttamente nella riga di comando.

GRUB, 42 byte

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

Syslinux, 186 byte

Questo richiede tre file il primo è syslinux.cfg (o isolinux.cfg, ecc.).

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

Per questo la parte difficile è che syslinux non ha alcuna semplice capacità di visualizzazione del testo, quindi il menu è abusato.


Non sono sicuro se puoi dire la risoluzione del sistema
operativo

Controlla la CPU e viene utilizzato per selezionare il sistema operativo corretto. Questo è fondamentalmente il codice golf del mio progetto di avvio.
hildred,

2
Quindi cambia il sistema operativo in base all'architettura. Pensare fuori dagli schemi. Mi piace.
tuskiomi,

Qual è il bytecount?
Restioson,

1
@hildred Credo che sarebbe più leggibile se tu ## iPXE, 36 bytes### ipxe 36
usassi

21

Julia 14 13 byte

n->8sizeof(1)

Spiegare:

  • Una funzione anon, che accetta qualsiasi cosa (incluso nothing) restituendo un numero intero 32 o 64
  • I letterali interi sono di tipo Intche, a seconda che sia a 32 bit o 64 bit, è un Int32o un Int64( 1potrebbe essere qualsiasi cifra)
  • posizionando un numero prima di una chiamata di funzione si verifica una moltiplicazione di giustapposizione
  • Questa è fondamentalmente una versione minimizzata del codice perSys.WORD_SIZE , usata nella risposta di rahnema1

Un'altra risposta divertente è ()->"$(Int)"[4:5], ma non riesco a fare il conto alla rovescia su quella.


-1 grazie a @Roman Gräf


Potresti usare un argomento fittizio: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf,

19

julia, 20 17 16 byte

n->Sys.WORD_SIZE

* Grazie a @LyndonWhite salvato 3 byte * Grazie a @ RomanGräf ha salvato un byte

Risposte precedenti:

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

Provalo online!


1
Personalmente, mi piace questo!
tuskiomi,

2
Con la seguente convenzione: codegolf.meta.stackexchange.com/q/2419/62131 puoi eliminare 3 byte facendo()->Sys.WORD_SIZE
Lyndon White il

1
Potresti anche usare un argomento fittizio: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf,

14

JavaScript (Node.js), 24 byte

_=>process.arch.slice(1)

Questa è una funzione e ritorna '32', '64'o, se nessuna 'rm'.


+1, ma suppongo che un arco a 64 bit potrebbe eseguire un sistema operativo a 32 bit
Octopus

1
Mi dà '32' su Windows a 32 bit, quindi sembra funzionare.
Ken YN,

5
È possibile radere 7 byte se si utilizza REPL e osinvece di process:os.arch().slice(1)
GilZ

Ciò restituisce l'architettura del sistema operativo segnalata al processo, non l'architettura del sistema operativo effettiva. Quindi questo non funziona su Linux. (Punch "setarch" nel tuo motore di ricerca preferito.)
David Schwartz,

@DavidSchwartz funziona benissimo sulla mia scatola di Linux a meno che non mi fraintenda, ma su PPCG possiamo ipotizzare un ambiente non modificato in termini di modifica dell'arco da parte
dell'utente

13

C, 33 31 29 23 byte

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

Grazie ai commentatori @ceilingcat e @Dennis per i suggerimenti sul golf!


13
Dice anche che si applicano le solite regole del codice golf e il ritorno da una funzione fa parte dei nostri valori predefiniti per l'I / O.
Dennis,

11
Non dipenderà dal fatto che si compili come programma a 32 o 64 bit?
Ken YN,

4
Questo non è conforme ai requisiti. " Si noti che un programma a 32 bit in esecuzione su un computer con un sistema operativo a 64 bit dovrebbe generare" 64 ". " Questo spiega come è stato compilato il programma, non quale sia il sistema operativo.
David Schwartz,

2
@DavidSchwartz "Puoi presumere che gli utenti utilizzeranno il software a 64 bit quando possibile."
Klas Lindbäck,

2
Ci dispiace dirlo, ma sizeof viene valutato al momento della compilazione. Quindi se compili un exe a 32 bit e lo esegui su un computer a 64 bit, ne uscirà 32 mentre dovrebbe produrre 64 ( stackoverflow.com/questions/2615203/… ). Bella idea però!
Dinaiz,

11

PowerShell, 16 byte

8*[IntPtr]::Size

Ottiene la dimensione del puntatore in byte, moltiplica per 8 per ottenere bit.


-1 perchéyour code must be able to run on Windows 4.10 or newer
ub3rst4r

11
@ ub3rst4r o più recente, non e più recente. Sono disposto a scommettere che una buona parte di queste risposte è difficile, nella migliore delle ipotesi, funzionare su una versione di Windows non supportata da tempo. È anche irragionevole aspettarsi che le persone eseguano test su 98 di tutti i sistemi operativi - al giorno d'oggi non è nemmeno facile da installare in una VM (fidati di me, ci ho provato. Non funzionerà su KVM e ha interazioni interessanti con gli adattatori di display VBox) . (Né ancora hanno un concetto di 64 bit ... che è un requisito veramente ridicola.)
Bob

1
@ ub3rst4r Dubito che tutti i linguaggi di programmazione interpretati qui abbiano un'implementazione che funziona su Windows 4.10!
Martin Rosenau,

1
Sembra che non funzioni se si tratta di una PowerShell a 32 bit su un sistema operativo a 64 bit.
Chris J,

@ChrisJ Almeno su Win10 e Win2012 R2 restituisce il risultato corretto da PowerShell x86. Non ho testato su Linux.
Booga Roo,

10

Python 2, 52, 48, 42 41 byte

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

Grazie a totalmente umano!


zoom! oltre la linea in meno di un minuto.
tuskiomi,

Continuerò a testarlo fino a quando non sarò a casa, ma non sono sicuro che questo stampi "32" e "64", ma in altri casi sono fiducioso.
tuskiomi,

@tuskiomi, questo stampa "32 bit" o "64 bit"
Daniel

1
from struct import*;print calcsize("P")*8è più corto.
totalmente umano il

12
Se lo esegui su Python a 32 bit in un sistema operativo a 64 bit, penso che questo ti mentirà. Anche la maggior parte delle altre risposte sembrano sensibili a ciò ...
Nick T

10

Java 8, 45 byte

()->System.getProperty("sun.arch.data.model")

@Dopapp Ciò che significa è che si tratta di uno snippet, non di un programma o di una funzione. In Java 8, questo dovrebbe funzionare:n=>System.getProperty("os.arch")
NoOneIsHere

@NoOneIsHere, oh grazie che mi è passato per la testa
Daniel,

2
"Se il codice viene eseguito su un sistema operativo a 32 bit, stampa" 32 ", se il codice viene eseguito su un sistema operativo a 64 bit, genera" 64 ". Stampa qualsiasi (altra) stringa non vuota di caratteri alfanumerici se è nessuno dei due.". Questo non lo fa affatto ...
Olivier Grégoire,

4
Riesci a ottenere Java 8 per Windows 98 (v4.10)?
Tessellating Heckler,

4
@TessellatingHeckler Java 8 richiede "i586" (qualunque cosa significhi). La voce dice: "il tuo codice deve essere in grado di funzionare su Windows 4.10 o versioni successive", non "il tuo codice deve essere in grado di funzionare su Windows 4.10 e versioni successive". Funziona su un Windows più recente .
Olivier Grégoire,


8

Windows CMD, 56 52 byte (grazie Bob!)

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

Ancora sorprendentemente lungo - il più lungo finora!


1
In realtà, %windir%\SysWOW64è ancora più breve, penso ...
Bob,

7
" deve essere in grado di funzionare su Windows 4.10 o versioni successive e almeno un sapore di Linux di tua scelta " - quale sapore di Linux per questo?
Tessellating Heckler,

1
@TessellatingHeckler se installi Wine ...?
Ken YN,

1
Che dire dell'uso della stenografia? if EXIST "c:\Progra~3" (echo 64)else echo 32Di default hai ProgramDatae Program Filesquindi se esiste un terzo, dovremmo essere 64
Marie,

3
Cosa verrà stampato per un sistema operativo a 8 bit?
tuskiomi,

7

C, API Win32, 103 183 byte

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

In realtà ci sono più di 2 casi qui. Esaminiamoli

  • Il più semplice: IsWow64Processnon esiste: siamo su un sistema operativo a 32 bit

Per i prossimi due casi abbiamo bisogno di sapere che il nostro binario sarà un eseguibile a 32 bit. E questa descrizione di ciò che sarà fuori nel parametro out diIsWow64Process

Un puntatore a un valore impostato su TRUE se il processo è in esecuzione su WOW64. Se il processo è in esecuzione su Windows a 32 bit, il valore è impostato su FALSE. Se il processo è un'applicazione a 64 bit in esecuzione su Windows a 64 bit, il valore è impostato anche su FALSE.

Questo ci lascia con due casi aggiuntivi:

  • IsWow64Process esiste e produce VERO -> Siamo su una macchina a 64 bit
  • IsWow64Process esiste e produce FALSO -> Siamo su una macchina a 32 bit

Non ci preoccupiamo della parte in cui un'applicazione a 64 bit su una Windows a 64 bit produce FALSO. Come sappiamo che la nostra applicazione è a 32 bit

Oh, e c'è un altro caso che non è coperto da questa sfida e dovrebbe essere comunque raro:

  • IsWow64Process esiste, ma non riesce: per impostazione predefinita si utilizza una macchina a 32 bit.

Questo dovrebbe coprire la maggior parte dei sistemi operativi Windows NT. Hanno testato solo su Win10 64-Bit, Win 7 64-Bit, Win 8.1 32-Bit e WinXP SP1 32-Bit


Risposta originale:

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

Per essere sicuri, dobbiamo distinguere solo 2 casi

  • IsWow64Process non esiste in kernel32.dll => Siamo su una macchina a 32 bit.

  • IsWow64Process esiste => Siamo su una macchina a 64 bit.

Il valore effettivo fornito da IsWow64Processè irrilevante per questa sfida, poiché vogliamo che il binario sia a 32 bit in ogni caso.

Diversamente dalla maggior parte delle risposte, ciò non dipende dal fatto che il binario stesso sia compilato sulla macchina su cui è eseguito.

Se conoscessi una funzione più breve presente solo su macchine a 64 bit e non a 32 bit, potrei accorciare la risposta.


2
Rilasciare .dlldalla stringa del nome del modulo. Non solo è buono per il golf, ma in realtà è anche una pratica migliore nell'uso normale. Inoltre, ai fini del golf, è possibile rilasciare lo spazio dopo #include.
Cody Grey,

Grazie, volevo davvero ridurre il tutto semplicemente cercando un modulo che può essere trovato su 64 bit ma non su 32 bit. Sto ancora cercando. Purtroppo (a questo scopo) non esiste un modulo chiamato WoW64.
Mr Paul Paul,

In realtà c'è un wow64.dlle Wow64Win.dll, ma non ho mai provato a chiamare GetModuleHandlecon quelli. Il problema, tuttavia, è che verrebbero caricati solo per un processo a 32 bit in esecuzione su un computer a 64 bit, non per un processo a 64 bit in esecuzione su un computer a 64 bit.
Cody Grey,

Io ho. Restituiscono 0 anche su una macchina a 64 bit. Ha senso in realtà. Non esistono per essere collegati direttamente. Il sistema si occupa del reindirizzamento durante il runtime.
Mr Paul Paul,

Ooh, problema però. Dalla documentazione dell'SDK: "Notare che questa tecnica non è un modo affidabile per rilevare se il sistema operativo è una versione di Windows a 64 bit poiché Kernel32.dll nelle versioni correnti di Windows a 32 bit contiene anche questa funzione."
Cody Grey,

7

C #, 60 50 byte

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

Grazie @TheLethalCoder


1
Benvenuti nel sito! :)
DJMcMayhem

4
Salvare 4 byte se si rimuove "Linea"
Giovanni

1
può anche rimuovere "Ambiente". e "console". supponendo l'uso di using static System.Environment;eusing static System.Console;
John il

1
inoltre, cambia WriteLineinWrite
Thomas Ayoub il

7
@John L'ultima volta che ho verificato, le importazioni devono essere incluse e quindi si aggiungerebbe al conteggio dei byte
Ceshion

6

Rubino, 22 byte

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

["any string"].pack("p")restituisce una stringa i cui byte corrispondono al puntatore che puntava verso "any string", ed è di 8 caratteri se il sistema operativo è a 64 bit o 4 caratteri se il sistema operativo è a 32 bit.


Poiché utilizza la dimensione del puntatore, verrà stampato a 32 bit quando l'interprete Ruby è un binario a 32 bit su un sistema operativo a 64 bit. Quindi manca una regola.
DarkDust,

1
@DarkDust You can assume that users will use 64 bit software whenever possible.Quindi si presume che gli utenti a 64 bit eseguano Ruby a 64 bit.
Value Ink

6

R, 16 byte

.Machine[[18]]*8

Restituisce la dimensione del puntatore.


1
Come tutte le soluzioni di dimensioni di puntatore, questo stamperà il risultato sbagliato quando il programma è un binario a 32 bit in esecuzione su un sistema operativo a 64 bit.
DarkDust,

1
@DarkDust R viene interpretato e possiamo supporre che l'utente utilizzi software a 64 bit ove possibile, quindi anche un interprete a 64 bit. IMHO, la regola si applica solo ai linguaggi compilati
NieDzejkob

@NieDzejkob Questa è esattamente la stessa logica che ho usato per la mia risposta in PHP quando qualcun altro ha inserito lo stesso tipo di commento in risposta alla mia risposta, vorrei che altri leggessero lo stesso dalla domanda che abbiamo supponendo che gli utenti useranno 64- software bit ove possibile con lingue interpretate.
Bja,

6

Perl, 18 15 18 byte

say length pack p8

Ottengo 64␤sul mio computer a 32 bit, perché è perlstato costruito con un IV a 64 bit. Scoprirai che questo è solitamente il caso quando esegui la versione a 32 bit di Windows.
Brad Gilbert b2gills il

@ BradGilbertb2gills Ho ripristinato il codice alla versione precedente; questo dovrebbe funzionare anche in questo caso. Fammi sapere se continua a non funzionare, eliminerò la mia risposta.
Grimmy,

1
Funziona correttamente
Brad Gilbert b2gills il

Sembra errato su HP 9000/785. Dà 32. Ma non credo che ci fossero CPU HP / PA-RISC a 32 bit.
Ole Tange,

6

codice macchina x86, 8 byte

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 compilato come eseguibile a 64 bit, restituisce 64 pollici eaxe, se compilato come 32 bit, restituisce 32, indipendentemente dal sistema operativo.

Questa risposta si basa sulle regole che dicono:

Puoi presumere che gli utenti useranno software a 64 bit ogni volta che sarà possibile.


Sebbene si tratti di un approccio interessante, come può essere scritto in un programma in modo tale da poter essere effettivamente eseguito? Ogni metodo che mi viene in mente di eseguire codice binario diverso dalla scrittura della propria funzione di caricamento utilizza file specifici del codice a 64 o 32 bit. Pertanto, per eseguire effettivamente ... avrai bisogno di due copie di questo codice ...
Jules,

@Jules Puoi metterlo come assembly inline in un programma linguistico di alto livello, come qui . Quindi devi solo usare il compilatore nativo della piattaforma con le sue opzioni predefinite e otterrai il testimone.
Ruslan,

@ l4m2 perché mi gridi? Ma hai ragione comunque, questi due byte sembrano essere una spazzatura lasciata dai miei esperimenti. Rimuoverà.
Ruslan,

5

PHP, 18 byte

<?=PHP_INT_SIZE*8;

Questo gestisce correttamente tutti i casi di CPU a 32, 64 e altri bit a condizione che PHP_INT_SIZE sia corretto, mostrerà la dimensione precisa della CPU indipendentemente da quale CPU PHP è in esecuzione!

Se PHP è in esecuzione

Sistema operativo a 32 bit PHP_INT_SIZE == 4,

Sistema operativo a 64 bit PHP_INT_SIZE == 8,

Sistema operativo a 16 bit PHP_INT_SIZE == 2 (teoricamente)

Sistema operativo a 8 bit PHP_INT_SIZE == 1 (di nuovo teoricamente)

Sistema operativo a 128 bit PHP_INT_SIZE == 16 (Non ancora raggiunto ma possibile)


2
quella costante ha le dimensioni del sistema operativo in cui è stato creato PHP, non eseguito
Einacio il

2
@Einacio Sì, ma nella sfida iniziale il poster ha scritto "Puoi presumere che gli utenti utilizzeranno il software a 64 bit ogni volta che è possibile", pertanto se il sistema operativo è a 64 bit, la versione di PHP in esecuzione sul sistema operativo dovrebbe essere considerata essere a 64 bit! (Nota: non vedo questo come una scappatoia solo pura logica basata sulla sfida iniziale.)
Bja

4

C # (29 byte)

Console.Write(IntPtr.Size*8);

10
Come tutte le soluzioni di dimensioni di puntatore, questo stamperà il risultato sbagliato quando il programma è un binario a 32 bit in esecuzione su un sistema operativo a 64 bit.
DarkDust,

1
È necessario specificare che questo è compilato per "AnyCPU" con la casella di controllo "Prefer 32-bit" non selezionata.
Cody Grey,

4

PowerShell, 17 52 byte

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

Restituisce 64 se si verifica una delle seguenti condizioni:

  • Si dispone di una directory sull'unità corrente con un nome file che termina in una parentesi chiusa, l'idea è quella di rilevare Program Files (x86).
  • archrestituisce una stringa che termina con 4(ASCII 52), come x86_64, al contrario di es i686.

Il try-catch ha lo scopo di aggirare l'errore che si ottiene se gci non restituisce nulla e non si ha un arco . Non ho trovato un modo più breve per farlo finora. GCI viene utilizzato su ls perché su Linux, ls produrrà un errore di visibile.

Questa versione dovrebbe rilevare se il sistema operativo è a 64 bit anziché solo PowerShell ed è testato per funzionare su Windows e Linux. Per il supporto Mac, sostituirlo archcon uname -m.

Versione precedente solo per Windows: -!(ls \*`))*32+64


su quale distro linux funziona questo?
tuskiomi,

@tuskiomi Oh, mio ​​cattivo - Capisco cosa intendi. Non ho letto correttamente la sfida. Devo eliminare la risposta?
Andy C.

Se sai che funzionerà con WINE, dovresti tenerlo.
tuskiomi,

@tuskiomi Almeno Ubuntu 14.04, 16.04, RHEL7, CentOS7 e alcune versioni di SUSE: github.com/PowerShell/PowerShell/releases
Xudonax

4

Swift 4 REPL / Playground, 12 byte

Int.bitWidth

Intha le dimensioni di una parola, agisce come uno Int32o Int64dipende dal sistema.


Non è un code-snip, quindi dovrebbe stampare? O dire che stai usando la REPL aggira quella restrizione?
Lyndon White,

1
Dipende dai giudici. L'uso di REPL non è molto comune, ma i Swift Playgrounds sono molto popolari (specialmente su iPad). Personalmente, penso che sia un gioco equo. Le persone progettano linguaggi di programmazione personalizzati per il golf che implicitamente stampano valori, e questo non è diverso
Alexander

4

Rubino, 10 byte

p 0.size*8

Mentre Ruby può usare numeri interi di qualsiasi lunghezza, internamente memorizza i valori che si adattano a una parola macchina come Fixnum. Il metodo Fixnum#sizerestituisce sempre la lunghezza in byte di una parola macchina.

La Fixnumclasse è stata rimossa in Ruby 2.4.0, la sua funzionalità è stata inclusa nella classe Integer. Il codice è valido.


4

Shell, 26 byte

uname -m|awk \$0=/_/?64:32

Puoi usare archinvece di uname -m.
Dennis,

1
@Dennis Non necessariamente. Su macos: uname -m-> x86_64, ma arch-> i386. Perché macos :( Inoltre, questo è specifico per bash - fallisce su zsh.
viraptor

@StevenPenny zshproverà a interpretare ?come un carattere jolly glob / singolo carattere.
Maniglia della porta

Funziona su Windows?
Ajasja,

1
@Ajasja con Cygwin
Steven Penny,

4

Bash, 25 17 byte

getconf LONG_BIT

Grazie a Dennis per l'aiuto nel golf.


4

C, 22 byte

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

Questa è una risposta basata sulla dimensione del puntatore che assume un file binario nativo. Il 0il cast int**(indirizzo 0x0). Quindi aggiungiamo 8 a 0, che, in C avanza, il puntatore di sizeof(int*)*8. 4 byte * 8 bit = 32, 8 byte * 8 bit = 64. Quindi otteniamo (int**)0x20e 0x40che vengono quindi implicitamente espressi come numeri interi restituendoli da una intfunzione di ritorno implicito .

C, autonomo, 34 byte

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

C, divertente con Unicode, 30 punti di codice, 34 byte (UTF-8)

main(){puts((int**)U" ㈳㐶"+1);}

Ho cercato di capire come funziona, ma sono all'oscuro. Puoi aggiungere una spiegazione?
NieDzejkob,

@jbcreix clever ...
NieDzejkob,

3

Java, 50 byte

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


È una biblioteca? Se sì, dovresti menzionarlo! Non vedo quella classe disponibile nel JDK 8 di Oracle (non ho i miei soliti JDK 6 e 7 a disposizione, atm).
Olivier Grégoire,

2
Questa risposta non è valida Non stampa.
Philipp,

6
Citando Dennis:> Dice anche che si applicano le solite regole del codice golf e il ritorno da una funzione fa parte delle nostre impostazioni predefinite per l'I / O.
Asu,

Modificalo in una funzione lamba per meno byte:()->com.sun.jna.Native.POINTER_SIZE*8
Ferrybig

3

PHP, 29 byte

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

https://3v4l.org/Y6JXv


Ooh. Mi piace questa. Come funziona?
tuskiomi,

4
php_uname('m')ritorna x86_64su un sistema operativo a 64 bit, altrimenti qualcosa di simile i386. 4essendo il 6 ° carattere (5a 0 indicizzato) della stringa, '4' - 4 == 0 == false. E @sopprime solo gli avvisi per stringhe non quotate e offset non inizializzati.
Petah,

2
Questo rileva l'architettura di PHP, non del sistema operativo. Sto eseguendo PHP a 32 bit su un Windows a 64 bit, php_uname('m')ritorna 'i586'.
Gras Double,

@GrasDouble bene immagino ymmv, con cui lavoro per me Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64.
Petah,

1
@tuskiomi stamperà 64 se esiste un sistema operativo a 8 bit
Bja

3

Python 3 , 77 84 71 59 byte

-13 byte, grazie a @JonathanAllan!
Fino a 59 di @Clearer

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

Provalo online!

Il mio pugno time-golfing :)
Dovrebbe produrre la versione corretta anche quando si esegue 32Bit-Python su 64 bit-OS.
Supponendo platform.machine()i*86o x86per 32 bit-OS. Non ne ho uno disponibile per verificare questo. L'output è 0quando il sistema operativo non è in 64/32 bit
Modifica: aggiunta istruzione di stampa, quindi ha ottenuto 7 byte in più


Non sono sicuro che sia accettabile perché è possibile eseguire un sistema operativo a 32 bit su una macchina a 64 bit (o avere una macchina chiamata a foo86che è 64 bit: p), ma se è accettabile è possibile salvare 9 (modifica .. .13!) Byte con print((a==64)*a+32*(a==86)).
Jonathan Allan,

from platform import*;print({'4':64,'6':32}[machine()[-1]])funzionerebbe anche.
Più chiaro il

@Clearer Mancano i seguenti vincoli: Importante: stampare qualsiasi altra stringa non vuota di caratteri alfanumerici se non è a 32 o 64 bit. .
TEMPO

@tOmAtE se non è né a 32 né a 64 bit, genererà un'eccezione, che stampa una stringa non vuota.
Più chiaro il

2
Prova l'architettura (), salva il dict: from platform import*;print(architecture()[0][:2])-> 50 byte
bugmenot123
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.