Ist mein Betriebssystem 32-Bit oder 64-Bit?


52

Es ist nicht mehr so ​​wichtig, aber gelegentlich muss es jemand wissen.

Hier ist ein einfaches Beispiel: Sagen Sie mir ohne Benutzereingabe, ob der Computer, auf dem der Code ausgeführt wird, ein 64-Bit-Betriebssystem oder ein 32-Bit-Betriebssystem ist!

Wenn der Code auf einem 32-Bit-Betriebssystem ausgeführt wird, geben Sie "32" aus. Wenn der Code auf einem 64-Bit-Betriebssystem ausgeführt wird, geben Sie "64" aus. Wichtig: Drucken Sie eine beliebige andere nicht leere Zeichenfolge aus alphanumerischen Zeichen, wenn es sich nicht um 32- oder 64-Bit handelt.

Bitte beachten Sie, dass ein 32-Bit-Programm, das auf einem Computer mit einem 64-Bit-Betriebssystem ausgeführt wird, "64" ausgeben sollte. Sie können davon ausgehen, dass Benutzer nach Möglichkeit 64-Bit-Software verwenden.

Um zur Teilnahme berechtigt zu sein, muss Ihr Code auf Windows 4.10 oder neueren von Microsoft unterstützten Windows-Systemen und mindestens einer Linux-Version Ihrer Wahl ausgeführt werden können (sofern diese Version kostenlos ist). Kompatibilitätsmods können installiert werden, solange das Programm noch den richtigen Wert zurückgibt.

Es gelten die üblichen Regeln.

Hinweis: Wenn Ihre Antwort nur zum Ausdrucken von 32 oder 64 gedacht ist, nicht jedoch für den Alternativfall, akzeptiere ich sie, aber es handelt sich nicht um eine konkurrierende Antwort.

Ich werde später versuchen, einige Ergebnisse der Ausführung dieser Codes auf verschiedenen Betriebssystemen zu veröffentlichen!


5
So „Bitte beachten Sie, dass ein 32 - Bit - Programm auf einem Computer ausgeführt werden mit einem 64 - Bit - Betriebssystem sollten eine Ausgabe‚64‘. Sie gehen davon aus , dass Benutzer 64 - Bit - Software verwenden, wann immer möglich.“ bedeutet, dass, wenn der Interpretter / Compiler usw. sowohl in 32-Bit- als auch in 64-Bit-Version verfügbar ist, auf einem 32-Bit-Betriebssystem immer die 32-Bit-Version des Interpreters / usw. ausgeführt wird und auf dem 64-Bit-Betriebssystem immer der 64-Bit-Interpreter ausgeführt wird /usw. Die Besorgnis über den Unterschied zwischen dem Programm 32 oder 64 und dem Betriebssystem 32 oder 64 ist im Grunde nur für Sprachen mit nur 32-Bit-Implementierungen ein Problem. Richtig?
Lyndon White

2
Viele Lösungen würden hier "32" auf einem 64-Bit-Betriebssystem ausgeben, wenn ein 32-Bit-Compiler zum Kompilieren des Programms verwendet würde. Ist das ok?
Martin Rosenau

15
Was in aller Welt ist "Windows 4.10"? Bedeutet das Windows 98? Oder heißt das Windows NT 4? Was halten Sie für "neuer"? Dies scheint eine außerordentlich schlecht durchdachte Herausforderung zu sein.
Cody Grey

13
Es gibt keine "offiziellen Windows-Spezifikationen" und niemand bezeichnet Windows 98 als "Windows 4.10". Sie sind buchstäblich die Ersten. Anstatt also zu versuchen, mit Versionsnummern cool oder offiziell zu klingen, sollten Sie einfach den tatsächlichen Produktnamen verwenden . Übrigens, Windows 9x war in einem 64-Bit-Build nie verfügbar. Ist es für mich also legitim, einen Eintrag einzureichen, der nur unter Windows 98 ausgeführt wird und nur "32" zurückgibt? Scheint sehr unfair / unsportlich / uninteressant, wäre aber technisch nach deinen Regeln erlaubt.
Cody Grey

3
Sie haben die Frage zur Windows-Version noch nicht beantwortet. Hat muss in der Lage sein , auf Windows 4.10 oder höher ausgeführt Mittelwert unter Windows 4.10 und all neueren Versionen oder auf einer einzelnen Windows - Version 4.10 oder höher ?
Dennis

Antworten:


45

x86-Assembly (mehrsprachig), 13 Byte

Bytecode:

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

Definiert eine Funktion, die 32 zurückgibt, wenn sie als 32-Bit, 64, wenn 64-Bit und 32767, wenn 16-Bit interpretiert wird.

Ich wollte einen Polyglot machen, der unter Windows und Linux lief, aber das ist viel schwieriger als ich dachte. Da ich nicht sicher bin, ob es überhaupt eine Möglichkeit gibt, einen Wert unter Nicht-16-Bit-Windows ohne Verknüpfung zu drucken.

Erläuterung

Dieser Code verwendet zwei Tells, um die Architektur zu bestimmen, auf der er ausgeführt wird. Der erste ist der Befehl 0x48 - bei 16 und 32 Bit ist dies der Fall dec %eax, bei 64 Bit handelt es sich jedoch um ein Präfix der Befehlsgröße . Der zweite Befehl ist derselbe. Wenn wir ihn jedoch auf dem Wert 0x8000 ausführen, wird das höchstwertige Bit nur dann umgedreht, wenn die Registergröße 16 Bit beträgt, wodurch das Überlaufflag gesetzt und die Verwendung zugelassen wird jo.

In 16 Bits wird dieser Code wie folgt interpretiert:

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

In 32 Bit wird dieser Code wie folgt interpretiert:

   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

In 64 Bit wird dieser Code wie folgt interpretiert:

   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

Dies ist eigentlich wahrscheinlich in Führung, sehr schön
Tuskiomi

1
Eine sehr gute Idee, aber wie implementiert, gibt dies den falschen Wert zurück, wenn es als 32-Bit-Binärdatei zusammengestellt und auf einem 64-Bit-Betriebssystem ausgeführt wird.
Cody Grey

@CodyGray von den Regeln: Sie können davon ausgehen, dass Benutzer, wann immer möglich, 64-Bit-Software verwenden. Ich nehme an, dies bedeutet auch, dass wir für Funktionen davon ausgehen können, dass der Anrufercode, wann immer möglich, 64 Bit beträgt.
Ruslan

Ah, ich nehme an, das ist eine faire Interpretation, @Ruslan. Und ich sehe, Sie haben bereits die Antwort gepostet, die ich im Sinn hatte , wäre es nicht für dieses Problem. :-) Du hast meine Zustimmung.
Cody Grey

wird das Byte 48repräsentiert dec %eaxin 16-Bit - Modus?
Phuclv

49

x86-Maschinencode, 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

Diese Funktion funktioniert unter Linux unter ELF32 nach i386 SysV ABI sowie unter Windows / Wine unter PE32 nach stdcallAufruf der Konvention.


Tatsächlich kann man die Anzahl der Bytes noch weiter reduzieren, wenn man einen anderen Ansatz verfolgt .
Ruslan

Was würde dies theoretisch in einer Nicht-32/64-Bit-Umgebung tun?
Tuskiomi

1
@tuskiomi In jedem Fall gibt dieser Code weiterhin entweder 32 oder 64 zurück. Der einzige Unterschied bei der Interpretation dieser Byte-Sequenz im 16-Bit-Modus besteht in einer Änderung der Mnemonik von eaxnach ax. Also, wenn der Selektor cszufällig ist 0x23, wird das Ergebnis 64 sein, sonst 32.
Ruslan

Dies sieht jedoch spezifisch für zwei bestimmte Betriebssysteme aus. Sie könnten leicht ein 32-Bit-System mit cs = 0x23 haben. Siehe stattdessen meine 8-Byte-Antwort, die stattdessen auf die CPU abzielt.
Peter Ferrie

@ Peterferrie Ja, deshalb habe ich eine andere Antwort . Aber deins übertrifft es um 2 Bytes.
Ruslan

32

Mathematica, 17 Bytes

$SystemWordLength

13
Natürlich gibt es eine eingebaute! \ s (+1)
tuskiomi

Sollten Sie nicht entweder eine hinzufügen &oder angeben, dass dies in der REPL steht?
LegionMammal978

5
@ LegionMammal978 "Wenn der Code auf einem 32-Bit-Betriebssystem ausgeführt wird, geben Sie" 32 "aus. Wenn der Code auf einem 64-Bit-Betriebssystem ausgeführt wird, geben Sie" 64 "aus. Drucken Sie eine beliebige (andere) nicht leere Zeichenfolge aus alphanumerischen Zeichen wenn es keiner ist. " Nicht "eine Funktion bereitstellen, die dies beim Ausführen tut"; nur "mach das".
Patrick Stevens

17
@PatrickStevens: Wenn in der Frage nicht angegeben ist, in welcher Form eine Übermittlung erfolgen soll, handelt es sich standardmäßig um ein Programm oder eine Funktion, jedoch nicht um ein Snippet .

3
@ ais523 Ich würde behaupten, in Mathematica gibt es keinen Unterschied zwischen Programmen, Funktionen und Ausschnitten. Alles ist nur ein Ausdruck.
Genisis

21

Bootloader

Wussten Sie, dass sowohl bei GRUB als auch bei IPXE die vollständigen Programmiersprachen von Turing zur Laufzeit verfügbar sind? Die Syslinux-Familie von Bootloadern kann dies jedoch nicht.

IPXE, 36 Byte

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

Die erste Zeile wird benötigt, wenn das Skript remote ausgeführt wird, jedoch nicht, wenn es direkt in der Befehlszeile eingegeben wird.

GRUB, 42 Bytes

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

Syslinux, 186 Bytes

Das braucht drei Dateien, die erste ist syslinux.cfg (oder isolinux.cfg usw.).

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

und t.cfg

menu title 32

ans an cfg

menu title 64

In diesem Fall ist der schwierige Teil, dass Syslinux keine einfachen Textanzeigefunktionen hat, sodass das Menü missbraucht wird.


Ich bin nicht sicher, ob Sie die OS-Auflösung mit einem Bootloader sagen können, aber ich mag die Idee
tuskiomi

Es überprüft die CPU und wird verwendet, um das richtige Betriebssystem auszuwählen. Dies ist im Grunde genommen Golfcode aus meinem Unboot-Projekt.
Hildred

2
Es ändert also das Betriebssystem basierend auf der Architektur. In andere Richtungen denken. Ich mag.
Tuskiomi

Was ist der bytecount?
Restioson

1
@ Hildred Ich glaube, es wäre besser lesbar, wenn Sie ## iPXE, 36 bytesanstelle von### ipxe 36
NieDzejkob

21

Julia 14 13 Bytes

n->8sizeof(1)

Erklären:

  • Anon-Funktion, die alles (einschließlich nothing) annimmt, was eine Ganzzahl von 32 oder 64 zurückgibt
  • Ganzzahlige Literale sind vom Typ Int, je nachdem, ob es sich bei 32-Bit- oder 64-Bit- Literalen um ein Int32oder ein Bit handelt Int64(das 1kann eine beliebige Ziffer sein).
  • Das Platzieren einer Nummer vor einem Funktionsaufruf führt eine Nebeneinander-Multiplikation durch
  • Dies ist im Grunde eine verkleinerte Version des Codes fürSys.WORD_SIZE , der in der Antwort von rahnema1 verwendet wird

Eine andere lustige Antwort ist ()->"$(Int)"[4:5], aber ich kann den Countdown für diese nicht abrufen.


-1 danke an @Roman Gräf


Sie können ein Scheinargument verwenden: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

19

julia, 20 17 16 bytes

n->Sys.WORD_SIZE

* Dank @LyndonWhite wurden 3 Bytes gespeichert * Dank @ RomanGräf wurde ein Byte gespeichert

Bisherige Antworten:

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

Probieren Sie es online!


1
Ich persönlich mag dieses!
Tuskiomi

2
Mit der folgenden Konvention: codegolf.meta.stackexchange.com/q/2419/62131 können Sie 3 Bytes auf diese Weise sparen()->Sys.WORD_SIZE
Lyndon White

1
Sie können auch ein Dummy-Argument verwenden: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

14

JavaScript (Node.js), 24 Byte

_=>process.arch.slice(1)

Dies ist eine Funktion und kehrt '32', '64'oder wenn weder 'rm'.


+1, aber ich nehme an, ein 64-Bit-Bogen könnte ein 32-Bit-Betriebssystem ausführen
Octopus

1
Gibt mir unter 32-Bit-Windows '32', sodass es anscheinend funktioniert.
Ken YN

5
Sie können 7 Bytes abschneiden, wenn Sie die REPL verwenden und osanstelle von process:os.arch().slice(1)
GilZ

Dies gibt die dem Prozess gemeldete Betriebssystemarchitektur zurück, nicht die tatsächliche Betriebssystemarchitektur. Das funktioniert also nicht unter Linux. (Geben Sie "setarch" in Ihre bevorzugte Suchmaschine ein.)
David Schwartz

@DavidSchwartz es funktioniert gut auf meiner Linux-Box, es sei denn, ich habe ein Missverständnis, aber auf PPCG können wir eine unmodifizierte Umgebung in Bezug auf den Benutzer annehmen, der den Bogen ändert
Downgoat

12

C 33 31 29 23 Bytes

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

Vielen Dank an die Kommentatoren @ceilingcat und @Dennis für die Golftipps!


13
Es heißt auch, dass die üblichen Codegolfregeln gelten und die Rückkehr von einer Funktion zu unseren Standardeinstellungen für E / A gehört.
Dennis

11
Kommt es nicht darauf an, ob Sie als 32- oder 64-Bit-Programm kompilieren?
Ken YN

4
Dies entspricht nicht den Anforderungen. " Bitte beachten Sie, dass ein 32-Bit-Programm, das auf einem Computer mit einem 64-Bit-Betriebssystem ausgeführt wird," 64 "ausgeben sollte. " Hier erfahren Sie, wie das Programm kompiliert wurde und nicht, was das Betriebssystem ist.
David Schwartz

2
@DavidSchwartz "Sie können davon ausgehen, dass Benutzer nach Möglichkeit 64-Bit-Software verwenden."
Klas Lindbäck

2
Tut mir leid, das zu sagen, aber sizeof wird zur Kompilierungszeit ausgewertet. Wenn Sie also eine 32-Bit-Exe kompilieren und auf einem 64-Bit-Computer ausführen, wird sie 32 ausgeben, während sie 64 ausgeben sollte ( stackoverflow.com/questions/2615203/… ). Gute Idee!
Dinaiz

11

PowerShell, 16 Byte

8*[IntPtr]::Size

Ruft die Zeigergröße in Byte ab und multipliziert sie mit 8, um Bits zu erhalten.


-1 weilyour code must be able to run on Windows 4.10 or newer
ub3rst4r

11
@ ub3rst4r oder neuer, nicht und neuer. Ich bin bereit zu wetten, dass es schwierig ist, einen guten Teil dieser Antworten auf einer lange nicht unterstützten Version von Windows auszuführen. Es ist auch unvernünftig Menschen auf 98 alle OSes zu testen , um zu erwarten - es ist nicht einmal leicht in einer VM in diesen Tagen zu installieren (. Vertrauen Sie mir, ich habe versucht , Not Gonna Run auf KVM und hat interessante Wechselwirkungen mit VBox - Display - Adapter) . (Auch nicht sie selbst haben ein Konzept von 64-Bit ... das ist eine wirklich lächerliche Forderung.)
Bob

1
@ ub3rst4r Ich bezweifle, dass alle hier interpretierten Programmiersprachen unter Windows 4.10 implementiert sind!
Martin Rosenau

1
Dies scheint zu scheitern, wenn es sich um eine 32-Bit-PowerShell auf einem 64-Bit-Betriebssystem handelt.
Chris J

@ChrisJ Zumindest unter Win10 und Win2012 R2 gibt es das richtige Ergebnis von x86 PowerShell zurück. Nicht unter Linux getestet.
Booga Roo

10

Python 2, 52, 48, 42, 41 Bytes

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

Danke an totalhuman!


Zoomen! in weniger als einer Minute über die Linie.
Tuskiomi

Ich werde warten, bis ich zu Hause bin, aber ich bin nicht sicher, ob dies "32" und "64" ausgibt, aber in anderen Fällen bin ich zuversichtlich.
Tuskiomi

@ Tuskiomi, dies druckt "32bit" oder "64bit"
Daniel

1
from struct import*;print calcsize("P")*8ist kürzer.
Totalhuman

12
Wenn Sie dies auf 32-Bit-Python in einem 64-Bit-Betriebssystem ausführen, werden Sie dies zu schätzen wissen. Die meisten anderen Antworten scheinen sowieso auch empfindlich dafür zu sein ...
Nick T

10

Java 8, 45 Bytes

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

@Dopapp Er meint damit, dass es sich um ein Snippet handelt, nicht um ein Programm oder eine Funktion. In Java 8 sollte dies funktionieren:n=>System.getProperty("os.arch")
NoOneIsHere

@NoOneIsHere, oh danke, das ging mir weit über den Kopf
Daniel

2
"Wenn der Code auf einem 32-Bit-Betriebssystem ausgeführt wird, geben Sie" 32 "aus, wenn der Code auf einem 64-Bit-Betriebssystem ausgeführt wird, geben Sie" 64 "aus. Drucken Sie eine beliebige (andere) nicht leere Zeichenfolge aus, wenn dies der Fall ist weder.". Das macht das überhaupt nicht ...
Olivier Grégoire

4
Können Sie Java 8 für Windows 98 (v4.10) bekommen?
TessellatingHeckler

4
@TessellatingHeckler Java 8 benötigt "i586" (was auch immer das bedeutet). Der Eintrag heißt es : „Ihr Code in der Lage sein muss , auf Windows 4.10 ausführen oder neuere“, nicht „Ihr Code muss auf Windows 4.10 in die Lage zu laufen und neueren“. Es läuft auf einem neueren Windows .
Olivier Grégoire


8

Windows CMD, 56 52 Bytes (danke Bob!)

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

Immer noch überraschend lang - bis jetzt am längsten!


1
Eigentlich %windir%\SysWOW64ist es sogar noch kürzer, denke ich ...
Bob

7
" Muss in der Lage sein, unter Windows 4.10 oder neuer und mit mindestens einer Linux-Version Ihrer Wahl zu laufen " - welche Linux-Version hierfür?
TessellatingHeckler

1
@TessellatingHeckler wenn du Wine installierst ...?
Ken YN

1
Was ist mit Kurzschrift? if EXIST "c:\Progra~3" (echo 64)else echo 32Standardmäßig haben Sie ProgramDataund Program Fileswenn ein dritter vorhanden ist, sollten wir 64 sein
Marie

3
Was wird dies für ein 8-Bit-Betriebssystem drucken?
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;}

Eigentlich gibt es hier mehr als 2 Fälle. Untersuchen wir sie

  • Das einfachste: IsWow64Processexistiert nicht: Wir arbeiten mit einem 32-Bit-Betriebssystem

Für die nächsten beiden Fälle müssen wir wissen, dass unsere Binärdatei eine 32-Bit-ausführbare Datei sein wird. Und diese Beschreibung dessen, was in den out- Parameter von ausgegeben wirdIsWow64Process

Ein Zeiger auf einen Wert, der auf TRUE gesetzt ist, wenn der Prozess unter WOW64 ausgeführt wird. Wenn der Prozess unter 32-Bit-Windows ausgeführt wird, wird der Wert auf FALSE festgelegt. Wenn es sich bei dem Prozess um eine 64-Bit-Anwendung handelt, die unter 64-Bit-Windows ausgeführt wird, wird der Wert ebenfalls auf FALSE festgelegt.

Das lässt uns mit zwei zusätzlichen Fällen:

  • IsWow64Process existiert und ergibt WAHR -> Wir sind auf einer 64-Bit-Maschine
  • IsWow64Process existiert und ergibt FALSE -> Wir sind auf einer 32-Bit-Maschine

Wir sind nicht besorgt über den Teil, in dem eine 64-Bit-Anwendung auf einem 64-Bit-Windows FALSE ergibt. Wie wir wissen dass unsere Anwendung 32-Bit ist

Oh, und es gibt noch einen weiteren Fall, der von dieser Herausforderung nicht abgedeckt wird und auf jeden Fall selten sein sollte:

  • IsWow64Process ist vorhanden, schlägt jedoch fehl: Wir verwenden standardmäßig einen 32-Bit-Computer.

Dies sollte die meisten Windows NT-Betriebssysteme abdecken. Habe nur auf Win10 64-Bit, Win7 64-Bit, Win 8.1 32-Bit und WinXP SP1 32-Bit getestet


Ursprüngliche Antwort:

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

Um sicherzugehen, müssen wir nur 2 Fälle unterscheiden

  • IsWow64Process existiert nicht in kernel32.dll => Wir sind auf einer 32-Bit-Maschine.

  • IsWow64Process existiert => Wir sind auf einer 64-Bit-Maschine.

Der tatsächliche Wert von IsWow64Process ist für diese Herausforderung unerheblich, da die Binärdatei auf jeden Fall 32 Bit sein soll.

Im Gegensatz zu den meisten Antworten hängt dies nicht davon ab, dass die Binärdatei selbst auf dem Computer kompiliert wird, auf dem sie ausgeführt wird.

Wenn ich eine kürzere Funktion kennen würde, die nur auf 64-Bit- und nicht auf 32-Bit-Computern verfügbar ist, könnte ich die Antwort verkürzen.


2
Löschen Sie die .dllZeichenfolge aus dem Modulnamen. Dies ist nicht nur gut zum Golfen, sondern es ist auch eine bessere Übung im normalen Gebrauch. Zum Golfen können Sie auch das Leerzeichen nachher ablegen #include.
Cody Grey

Danke, ich wollte eigentlich das Ganze reduzieren, indem ich nur nach einem Modul suchte, das auf 64-Bit aber nicht auf 32-Bit zu finden ist. Ich gucke immer noch. Leider gibt es (für diesen Zweck) kein Modul namens WoW64.
MrPaulch

Es gibt tatsächlich ein wow64.dllund Wow64Win.dll, aber ich habe noch nie versucht, GetModuleHandlemit denen anzurufen . Das Problem ist jedoch, dass sie nur für einen 32-Bit-Prozess geladen werden, der auf einem 64-Bit-Computer ausgeführt wird, nicht für einen 64-Bit-Prozess, der auf einem 64-Bit-Computer ausgeführt wird.
Cody Grey

Ich habe. Sie geben sogar auf einer 64-Bit-Maschine 0 zurück. Macht eigentlich Sinn. Sie existieren nicht, um direkt damit verbunden zu werden. Das System kümmert sich zur Laufzeit um die Umleitung.
MrPaulch

Oh, aber ein Problem. Aus der SDK-Dokumentation: "Beachten Sie, dass diese Technik keine zuverlässige Methode ist, um festzustellen, ob es sich bei dem Betriebssystem um eine 64-Bit-Version von Windows handelt, da die Datei" Kernel32.dll "in aktuellen Versionen von 32-Bit-Windows ebenfalls diese Funktion enthält."
Cody Grey

7

C #, 60-50 Bytes

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

Danke @TheLethalCoder


1
Willkommen auf der Seite! :)
DJMcMayhem

4
Sparen Sie 4 Bytes, wenn Sie "Line"
John

1
kann auch "Umgebung" entfernen. und "Konsole". unter der Annahme der Verwendung von using static System.Environment;undusing static System.Console;
John

1
Wechseln Sie auch WriteLinezuWrite
Thomas Ayoub

7
@ John Das letzte Mal, als ich es überprüft habe, müssen Importe einbezogen werden, und so würde sich die
Bytezahl erhöhen

6

Ruby, 22 Bytes

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

["any string"].pack("p")Gibt eine Zeichenfolge zurück, deren Bytes dem Zeiger entsprechen, auf den gezeigt "any string"wird. Bei einem 64-Bit-Betriebssystem sind es 8 Zeichen, bei einem 32-Bit-Betriebssystem 4 Zeichen.


Da hierbei die Zeigergröße verwendet wird, wird 32-Bit gedruckt, wenn der Ruby-Interpreter unter einem 64-Bit-Betriebssystem eine 32-Bit-Binärdatei ist. Also verfehlt eine Regel.
DarkDust

1
@DarkDust Es You can assume that users will use 64 bit software whenever possible.wird also angenommen, dass 64-Bit-Benutzer 64-Bit-Ruby ausführen .
Value Ink

6

R, 16 Bytes

.Machine[[18]]*8

Gibt die Zeigergröße zurück.


1
Wie bei allen Lösungen mit Zeigergröße wird das falsche Ergebnis ausgegeben, wenn das Programm eine 32-Bit-Binärdatei ist, die unter einem 64-Bit-Betriebssystem ausgeführt wird.
DarkDust

1
@DarkDust R wird interpretiert, und wir können davon ausgehen, dass der Benutzer nach Möglichkeit 64-Bit-Software verwendet, also auch einen 64-Bit-Interpreter. IMHO, die Regel gilt nur für kompilierte Sprachen
NieDzejkob

@NieDzejkob Das ist genau die gleiche Logik, die ich für meine Antwort in PHP verwendet habe, wenn jemand anderes dieselbe Art von Kommentar als Antwort auf meine Antwort gegeben hat. Bit-Software wo möglich mit interpretierten Sprachen.
Bja

6

Perl, 18 15 18 Bytes

say length pack p8

Ich bekomme 64␤auf meinem 32 Bit Computer, weil perlmit einem 64 Bit IV gebaut wurde. Dies ist normalerweise der Fall, wenn Sie mit einer 32-Bit-Version von Windows arbeiten.
Brad Gilbert b2gills

@ BradGilbertb2gills Ich habe den Code auf die vorherige Version zurückgesetzt. Dieser sollte auch in diesem Fall funktionieren. Lassen Sie mich wissen, wenn es immer noch nicht funktioniert, ich werde meine Antwort löschen.
Grimmy

1
Das funktioniert einwandfrei
Brad Gilbert b2gills

Scheint auf HP 9000/785 falsch. Gibt 32. Aber ich glaube nicht, dass es 32-Bit-HP / PA-RISC-CPUs gab.
Ole Tange

6

x86-Maschinencode, 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

Wenn es als ausführbare 64-Bit-Datei kompiliert wird, gibt es 64 Zoll zurück eax . Wenn es als 32-Bit kompiliert wird, gibt es 32 zurück - unabhängig vom Betriebssystem.

Diese Antwort basiert auf den Regeln:

Sie können davon ausgehen, dass Benutzer nach Möglichkeit 64-Bit-Software verwenden.


Obwohl dies ein interessanter Ansatz ist, wie kann er so in ein Programm geschrieben werden, dass er tatsächlich ausgeführt werden kann? Jede Methode, die ich mir vorstellen kann, anderen Binärcode auszuführen, als Ihre eigene Loader-Funktion zu schreiben, verwendet Dateien, die für 64-Bit- oder 32-Bit-Code spezifisch sind. Daher benötigen Sie zwei Kopien dieses Codes, um tatsächlich ausgeführt zu werden ...
Jules,

@Jules Sie können es wie hier als Inline-Assembly in ein übergeordnetes Sprachprogramm einfügen . Dann müssen Sie nur noch Ihren plattformeigenen Compiler mit seinen Standardoptionen verwenden, und Sie erhalten die Bitigkeit.
Ruslan

@ l4m2 warum schreist du mich an? Aber Sie haben trotzdem Recht, diese zwei Bytes scheinen ein bisschen Müll von meinen Experimenten zu sein. Wird Entfernen.
Ruslan

5

PHP, 18 Bytes

<?=PHP_INT_SIZE*8;

Damit werden alle Fälle von 32-, 64- und anderen Bit-CPUs korrekt behandelt. Vorausgesetzt, PHP_INT_SIZE ist korrekt, wird die genaue Größe der CPU angezeigt, unabhängig davon, auf welcher CPU PHP ausgeführt wird!

Wenn PHP läuft

32-Bit-Betriebssystem PHP_INT_SIZE == 4,

64-Bit-Betriebssystem PHP_INT_SIZE == 8,

16-Bit-Betriebssystem PHP_INT_SIZE == 2 (theoretisch)

8-Bit-Betriebssystem PHP_INT_SIZE == 1 (wieder theoretisch)

128-Bit-Betriebssystem PHP_INT_SIZE == 16 (noch nicht erreicht, aber möglich)


2
Diese

2
@Einacio Ja, aber bei der ersten Herausforderung schrieb das Poster: "Sie können davon ausgehen, dass Benutzer, wann immer möglich, 64-Bit-Software verwenden". Wenn das Betriebssystem 64-Bit ist, muss daher davon ausgegangen werden, dass die Version von PHP auf dem Betriebssystem ausgeführt wird 64-Bit sein! (Hinweis: Ich sehe dies nicht als eine Lücke, sondern als reine Logik, die auf der anfänglichen Herausforderung basiert.)
Bja

4

C # (29 Bytes)

Console.Write(IntPtr.Size*8);

10
Wie bei allen Lösungen mit Zeigergröße wird das falsche Ergebnis ausgegeben, wenn das Programm eine 32-Bit-Binärdatei ist, die unter einem 64-Bit-Betriebssystem ausgeführt wird.
DarkDust

1
Es muss angegeben werden, dass dies für "AnyCPU" kompiliert wurde, wobei das Kontrollkästchen "32-Bit bevorzugen" deaktiviert ist.
Cody Grey

4

Power Shell, 17 52 Bytes

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

Gibt 64 zurück, wenn eine der folgenden Bedingungen erfüllt ist:

  • Auf Ihrem aktuellen Laufwerk befindet sich ein Verzeichnis mit einem Dateinamen, der auf "close paren" endet Program Files (x86).
  • archgibt einen String zurück, der mit 4(ASCII 52) endet , wie x86_64im Gegensatz zu z i686.

Der Try-Catch soll den Fehler umgehen, den Sie erhalten, wenn gci nichts zurückgibt und Sie keinen Bogen haben . Ich habe bisher keinen kürzeren Weg gefunden. GCI wird verwendet , über ls weil auf Linux, ls einen sichtbaren Fehler produzieren.

Diese Version sollte erkennen, ob das Betriebssystem 64-Bit ist und nicht nur PowerShell. Es wurde getestet, um unter Windows und Linux zu funktionieren. Für Mac - Unterstützung, ersetzen archmit uname -m.

Vorherige Nur-Windows-Version: -!(ls \*`))*32+64


Auf welcher Linux-Distribution läuft das?
Tuskiomi

@ Tuskiomi Oh, meine schlechte - ich verstehe, was du meinst. Die Herausforderung nicht richtig gelesen. Soll ich die Antwort löschen?
Andy C.

Wenn Sie wissen, dass es mit WINE funktioniert, sollten Sie es behalten.
Tuskiomi

@tuskiomi Zumindest Ubuntu 14.04, 16.04, RHEL7, CentOS7 und einige Versionen von SUSE: github.com/PowerShell/PowerShell/releases
Xudonax

4

Swift 4 REPL / Playground, 12 Bytes

Int.bitWidth

Intist wortgroß und verhält sich entweder wie Int32oder Int64abhängig vom System.


Ist das nicht ein Code-Schnipsel, also sollte es gedruckt werden? Oder umgehen Sie diese Einschränkung, wenn Sie sagen, dass Sie die REPL verwenden?
Lyndon White

1
Das liegt an den Richtern. Die Verwendung von REPL ist nicht sehr verbreitet, aber Swift Playgrounds sind sehr beliebt (besonders auf dem iPad). Persönlich denke ich, dass es faires Spiel ist. Die Leute entwerfen benutzerdefinierte Programmiersprachen für das Golfen, die implizit Werte ausgeben, und das ist nicht anders
Alexander

4

Ruby, 10 Bytes

p 0.size*8

Ruby kann zwar Ganzzahlen beliebiger Länge verwenden, speichert jedoch intern die Werte, die in ein Maschinenwort passen, als Fixnum. Die Methode liefert Fixnum#sizeimmer die Länge eines Maschinenwortes in Bytes.

Die FixnumKlasse wurde in Ruby 2.4.0 entfernt, ihre Funktionalität wurde in die Klasse aufgenommen Integer. Der Code steht.


4

Shell, 26 Bytes

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

Sie können archanstelle von verwenden uname -m.
Dennis

1
@ Tennis Nicht unbedingt. Auf Macos: uname -m-> x86_64, aber arch-> i386. Denn macos :( Auch dies ist bash-spezifisch - schlägt auf zsh fehl.
Viraptor

@StevenPenny zshwird versuchen, den ?Platzhalter als Glob / Einzelzeichen zu interpretieren .
Türknauf

Läuft das unter Windows?
Ajasja

1
@ Ajasja mit Cygwin
Steven Penny

4

Bash, 25 17 Bytes

getconf LONG_BIT

Vielen Dank an Dennis für die Golfhilfe.


4

C, 22 Bytes

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

Dies ist eine auf der Zeigergröße basierende Antwort, die eine native Binärdatei voraussetzt. Das 0ist gegossen an int**(Adresse 0x0). Dann addieren wir 8 zu 0, was in C den Zeiger um vorrückt sizeof(int*)*8. 4 Bytes * 8 Bits = 32, 8 Bytes * 8 Bits = 64. Also bekommen wir (int**)0x20und0x40 die werden dann implizit als ganze Zahlen umgewandelt, indem sie von einem implizit zurückgegeben werdenint zurückgegebenen Funktion zurückgegeben werden.

C, eigenständig, 34 Bytes

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

C, Spaß mit Unicode, 30 Code-Punkte, 34 Bytes (UTF-8)

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

Ich habe versucht zu verstehen, wie das funktioniert, aber ich bin ahnungslos. Können Sie eine Erklärung hinzufügen?
NieDzejkob

@jbcreix clever ...
NieDzejkob

3

Java, 50 Bytes

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


Ist das eine Bibliothek? Wenn ja, solltest du es erwähnen! Ich sehe diese Klasse jedoch nicht im JDK 8 von Oracle (ich habe nicht das übliche JDK 6 und 7 zur Verfügung, atm).
Olivier Grégoire

2
Diese Antwort ist ungültig. Es wird nicht gedruckt.
Philipp

6
Zitat Dennis:> Es heißt auch, dass die üblichen Code-Golf-Regeln gelten und die Rückkehr von einer Funktion zu unseren Standardeinstellungen für E / A gehört.
Asu

Ändern Sie es in eine Lamba-Funktion für weniger Bytes:()->com.sun.jna.Native.POINTER_SIZE*8
Ferrybig

3

PHP, 29 Bytes

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

https://3v4l.org/Y6JXv


Oh. Ich mag dieses. Wie funktioniert es?
Tuskiomi

4
php_uname('m')kehrt x86_64auf einem 64 bit OS zurück, ansonsten sowas i386. 4wobei es sich um das sechste Zeichen (mit dem Index 5: 0) der Zeichenfolge handelt '4' - 4 == 0 == false,. Und @unterdrückt nur Warnungen für nicht notierte Strings und uninitialised Offsets.
Petah

2
Dies erkennt die Architektur von PHP, nicht des Betriebssystems. Ich bin mit 32-Bit - PHP auf einem 64-Bit - Windows php_uname('m')gibt 'i586'.
Gras Double

@GrasDouble naja ich schätze ymmv, ich arbeite bei mir mit Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64.
Petah

1
@tuskiomi dies wird 64 ausgeben, wenn es ein 8-Bit-Betriebssystem gibt
Bja

3

Python 3 , 77 84 71 59 Bytes

-13 Bytes, danke an JonathanAllan!
Bis auf 59 von @Clearer

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

Probieren Sie es online!

Mein erstes Mal Code-Golfen :)
Sollte die richtige Version ausgeben, auch wenn 32Bit-Python auf 64bit-OS läuft.
Vorausgesetzt es platform.machine()gibt i*86oder x86für 32Bit-OS. Ich habe keine, um dies zu überprüfen. Die Ausgabe erfolgt, 0wenn das Betriebssystem nicht im 64/32-
Bit- Modus ist


Ich bin mir nicht sicher, ob dies akzeptabel ist, da es möglich ist, ein 32-Bit-Betriebssystem auf einem 64-Bit-Computer auszuführen (oder einen Computer mit der Bezeichnung foo8664-Bit: p). Wenn dies jedoch akzeptabel ist, können Sie 9 speichern (bearbeiten). .13!) Bytes mit print((a==64)*a+32*(a==86)).
Jonathan Allan

from platform import*;print({'4':64,'6':32}[machine()[-1]])würde auch funktionieren.
Clearer

@Clearer Dies würde folgende Einschränkung verfehlen: Wichtig: Drucken Sie eine beliebige andere nicht leere Zeichenfolge aus alphanumerischen Zeichen, wenn es sich weder um 32- noch um 64-Bit handelt. .
TOmATE

@tOmAtE Wenn es sich weder um 32 noch um 64 Bit handelt, wird eine Ausnahme ausgelöst, die eine nicht leere Zeichenfolge ausgibt.
Clearer

2
Versuchen Sie Architektur (), speichert das Diktat: from platform import*;print(architecture()[0][:2])-> 50 Bytes
Bugmenot123
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.