我的操作系统是32位还是64位?


52

它不再是太重要了,但是偶尔有人需要知道。

这是一个简单的练习:没有用户输入,请告诉我运行代码的计算机是在64位操作系统还是32位操作系统上!

如果代码在32位操作系统上运行,则打印“ 32”,如果代码在64位操作系统上运行,则输出“ 64”。重要: 如果不是32位或64位字符,请打印其他任何非空的字母数字字符字符串。

请注意,在具有64位操作系统的计算机上运行的32位程序应输出“ 64”。您可以假设用户将尽可能使用64位软件。

为了有资格进入,您的代码必须能够在Windows 4.10或更高版本的 Microsoft支持的Windows系统上运行,并且至少可以选择一种Linux(只要免费提供)。只要程序仍然返回正确的值,就可以安装兼容性模块。

通常使用规则。

注意:如果您的答案仅打算打印32或64,而不是alt大小写,我会接受的,但这不是竞争性答案。

稍后,我将尝试发布在不同操作系统上运行这些代码的一些结果!


5
因此,“请注意,在具有64位操作系统的计算机上运行的32位程序应输出“ 64”。您可以假设用户将尽可能使用64位软件。” 意味着如果解释器/编译器等同时支持32位和64位,则32位操作系统将始终运行解释器/ etc的32位版本,而64位操作系统将始终运行64位解释器/等等。因此,对于仅使用32位实现的语言而言,担心程序是32还是64和OS是32还是64之间的差异基本上一个问题。对?
林登·怀特

2
如果使用32位编译器来编译程序,则此处的许多解决方案都会在64位OS上显示“ 32”。这个可以吗?
Martin Rosenau

15
“ Windows 4.10”到底是什么?这是否意味着Windows 98?还是Windows NT 4?您认为比这更“新”的是什么?这似乎是一个非常糟糕深思熟虑的挑战。
科迪·格雷

13
没有“官方Windows规范”,没有人将Windows 98称为“ Windows 4.10”。你真的是第一个。因此,也许不要使用版本号来听起来很酷或正式,而应该使用实际的产品名称。顺便说一句,Windows 9x从来没有在64位版本中可用,因此提交仅在Windows 98上运行并仅返回“ 32”的条目对我来说是否真的合法?似乎非常不公平/不运动/不有趣,但从技术上讲,您的规则允许这样做。
科迪·格雷

3
您仍然没有回答有关Windows版本的问题。是否必须能够在Windows 4.10或更高版本上运行平均在Windows 4.10,所有新版本任何单一的Windows版本,4.10或更高版本
丹尼斯,

Answers:


45

x86 Assembly(polyglot),13个字节

字节码:

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

定义一个函数,如果将其解释为32位,则返回32,如果是64位,则返回64,如果是16位,则返回32767。

我想制作一个可以在Windows和Linux上运行的多语言软件,但这比我想象的要难得多。因为我不确定在没有链接的情况下甚至可以在非16位Windows上打印任何值。

说明

此代码使用两个告诉来确定其运行的体系结构。第一个是指令0x48,在16位和32位上,是dec %eax,但是在64位上,它是指令大小的前缀。第二个告诉是同一条指令,但是,当我们在值0x8000上执行它时,仅当寄存器大小为16位时才翻转最高有效位,设置溢出标志并让我们使用jo

在16位中,此代码解释如下:

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

在32位中,此代码解释如下:

   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

在64位中,此代码解释如下:

   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

这实际上可能是带头的,非常好
tuskiomi

1
一个非常简洁的想法,但是在实施时,如果将其组装为32位二进制文​​件并在64位操作系统上运行,则将返回错误的值。
科迪·格雷

@CodyGray根据规则:您可以假设用户将尽可能使用64位软件。我想这也意味着对于函数,我们可以假设调用者代码是尽可能的64位。
Ruslan

嗯,我想这是一个合理的解释,@ Ruslan。而且我看到您已经发布了我心目中的答案,如果不是这个问题的话。:-)你赞成我。
科迪·格雷

字节48代表dec %eax16位模式吗?
phuclv

49

x86机器码,12个字节

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

取消高尔夫:

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

在i386 SysV ABI之后的ELF32中使用时,此函数在Linux中起作用;在PE32中使用时,在遵循stdcall调用约定时,该函数在Windows / Wine中也起作用。


实际上,如果采用另一种方法,则可以进一步减少字节数。
Ruslan

在非32/64位环境中,这理论上会做什么?
tuskiomi

1
@tuskiomi无论如何,此代码仍将返回32或64。在16位模式下解释此字节序列的唯一区别是助记符从更改eaxax。因此,如果选择器在cs正好是0x23,其结果将是64,否则32.
鲁斯兰

不过,这看起来特定于两个特定的操作系统。您可以轻松拥有cs = 0x23的32位系统。相反,请参阅我针对CPU的8字节答案。
彼得·费里

@peterferrie是的,这就是为什么我还有另一个答案。但是您的确超出了2个字节。
Ruslan

32

Mathematica,17个字节

$SystemWordLength

13
当然有内置功能!\ s(+1)
tuskiomi17年

您不应该添加一个&或指定它在REPL中吗?
LegionMammal978

5
@ LegionMammal978“如果代码在32位操作系统上运行,则打印” 32“;如果代码在64位操作系统上运行,则输出” 64“。打印任何(其他)字母数字字符的非空字符串如果两者都不是。” 不是“提供运行时执行此操作的功能”;只是“做这个”。
帕特里克·史蒂文斯

17
@PatrickStevens:如果问题未指定提交应采用的形式,则默认为程序或函数,而不是摘要。

3
@ ais523我认为在Mathematica中程序,函数和代码片段之间没有区别。一切都只是一种表达。
ngenisis

21

引导加载程序

您是否知道GRUB和IPXE都具有可在运行时访问的Turing完整编程语言?Syslinux系列引导加载程序没有,但是他们可以做到这一点。

IPXE,36个字节

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

如果脚本是远程运行的,则需要第一行,但是如果直接在命令行中键入,则不需要。

GRUB,42个字节

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

Syslinux,186字节

这需要三个文件,第一个是syslinux.cfg(或isolinux.cfg等)。

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

和t.cfg

menu title 32

ans s.cfg

menu title 64

对于这一点,困难的部分是syslinux没有任何简单的文本显示功能,因此菜单被滥用。


我不确定您是否可以使用引导加载程序告诉操作系统分辨率,但是我喜欢这个主意
tuskiomi

它检查cpu,并用于选择正确的操作系统。这基本上是我的卸载项目中的代码。
hildred

2
因此,它根据体系结构更改了操作系统。外箱思考。我喜欢。
tuskiomi

什么是字节数?
Restioson

1
@hildred我相信,如果您使用它## iPXE, 36 bytes而不是### ipxe 36
NieDzejkob,2017年

21

朱莉娅14 13字节

n->8sizeof(1)

说明:

  • Anon函数,取任何值(包括nothing)返回整数32或64
  • 整数字面量的类型Int取决于32位还是64位,可以是an Int32或an Int641可以是任何数字)
  • 在函数调用之前放置数字并置乘法
  • 这基本上是rahnema1的答案中使用的代码Sys.WORD_SIZE的简化版本

另一个有趣的答案是()->"$(Int)"[4:5],但我不能指望那个。


-1感谢@RomanGräf



19

朱莉娅,20 17 16字节

n->Sys.WORD_SIZE

*感谢@LyndonWhite保存了3个字节*感谢@RomanGräf保存了一个字节

先前的答案:

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

在线尝试!


1
我个人喜欢这个!
tuskiomi

2
按照以下约定:codegolf.meta.stackexchange.com/q/2419/62131您可以通过执行以下操作来减少3个字节()->Sys.WORD_SIZE
Lyndon White

1
:您还可以使用虚拟的参数codegolf.meta.stackexchange.com/a/12696/56341
罗马格拉夫

14

JavaScript(Node.js),24个字节

_=>process.arch.slice(1)

这是一个函数,并返回'32''64'或如果既不'rm'


+1,但我想64位架构可能运行32位操作系统
Octopus,

1
在32位Windows上给我“ 32”,因此它确实可以正常工作。
肯·YN

5
如果您使用的是REPL,则可以减少7个字节,os而不是processos.arch().slice(1)
GilZ

这将返回报告给流程的OS体系结构,而不是实际的OS体系结构。因此,这在Linux上不起作用。(将“ setarch”打入您喜欢的搜索引擎。)
David Schwartz

@DavidSchwartz除非我有误解,否则它在我的Linux机器上都可以正常工作,但是在PPCG上,我们可以假设用户更改拱门时未修改的环境
Downgoat

12

C,33 31 29 23字节

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

感谢评论者@ceilingcat和@Dennis提供的高尔夫技巧!


13
它还表示适用通常的代码高尔夫规则,并且从函数返回是我们I / O默认设置的一部分。
丹尼斯,

11
这是否取决于您将其编译为32位还是64位程序?
Ken YN

4
这不符合要求。“ 请注意,在具有64位操作系统的计算机上运行的32位程序应输出“ 64”。 ”这告诉您程序是如何编译的,而不是OS是什么。
David Schwartz

2
@DavidSchwartz“您可以假设用户将尽可能使用64位软件。”
克拉斯·林德贝克(KlasLindbäck)

2
不好意思说,但是sizeof是在编译时评估的。因此,如果编译32位exe并在64位计算机上运行它,它将输出32,而它应输出64(stackoverflow.com/questions/2615203/…)。好主意!
Dinaiz

11

PowerShell,16字节

8*[IntPtr]::Size

获取指针大小(以字节为单位),乘以8得到位。


-1因为your code must be able to run on Windows 4.10 or newer
ub3rst4r

11
@ ub3rst4r 较新的,不较新的。我愿意打赌,这些答案中有很大一部分很难在长期不受支持的Windows版本上运行。期望人们在所有98种操作系统上进行测试也是不合理的-这些天在VM中安装甚至都不容易(相信我,我已经尝试过。不能在KVM上运行,并且它与VBox显示适配器具有有趣的交互作用) 。(它也没有,甚至 64位的概念...这是一个真正的荒谬的要求。)
鲍勃·

1
@ ub3rst4r我怀疑这里所有解释的编程语言是否都可以在Windows 4.10上实现?
Martin Rosenau

1
如果它是64位OS上的32位Powershell,则看起来失败。
克里斯J

@ChrisJ至少在Win10和Win2012 R2上,它从x86 PowerShell返回正确的结果。尚未在Linux上进行测试。
Booga Roo

10

Python 2,52,48,42 41字节

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

多亏全人类!


放大!在不到一分钟的时间内越过线。
tuskiomi

我要等到我回家后再进行测试,但是我不确定这会打印出“ 32”和“ 64”,但是我确信其他情况。
tuskiomi

@tuskiomi,此打印“ 32bit”或“ 64bit”
Daniel

1
from struct import*;print calcsize("P")*8更短。
20:42完全人类

12
如果您在64位操作系统上的32位Python上运行此代码,我认为这将对您有所帮助。无论如何,大多数其他答案似乎也很敏感……
Nick T

10

Java 8,45字节

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

@Dopapp他的意思是这是代码段,而不是程序或功能。在Java 8中,这应该可以工作:n=>System.getProperty("os.arch")
NoOneIsHere17年

@NoOneIsHere,哦,谢谢你,这让我望而却步
Daniel

2
“如果代码在32位操作系统上运行,则打印“ 32”;如果代码在64位操作系统上运行,则输出“ 64”。都不是。” 这一点都没有做到……
OlivierGrégoire17年

4
您可以获得Windows 98(v4.10)的Java 8吗?
TessellatingHeckler

4
@TessellatingHeckler Java 8需要“ i586”(无论如何)。该条目说:“你的代码必须能够在Windows上运行4.10 更新”,而不是“你的代码必须能够在Windows上运行4.10 更新”。它运行在Windows的较新版本上
OlivierGrégoire17年


8

Windows CMD,56 52字节(感谢Bob!)

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

仍然令人惊讶的冗长-迄今为止最长!


1
%windir%\SysWOW64我想,实际上甚至更短……
鲍勃

7
必须能够在Windows 4.10或更高版本上运行,并且至少要选择一种Linux ” –哪种Linux?
TessellatingHeckler

1
@TessellatingHeckler,如果您安装Wine ...?
Ken YN

1
那用速记呢?if EXIST "c:\Progra~3" (echo 64)else echo 32默认情况下,您拥有ProgramDataProgram Files因此,如果存在三分之一,我们应该是64岁
Marie

3
对于8位操作系统,这将打印什么?
tuskiomi

7

C,Win32 API的,103个 183字节

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

实际上,这里有2种以上的案例。让我们检查一下

  • 最简单:IsWow64Process不存在:我们使用的是32位操作系统

在接下来的两种情况下,我们需要知道二进制文件将是32位可执行文件。以及对将out放入out参数的描述IsWow64Process

如果进程在WOW64下运行,则指向设置为TRUE的值的指针。如果该进程在32位Windows下运行,则将该值设置为FALSE。如果该进程是在64位Windows下运行的64位应用程序,则该值也设置为FALSE。

这给我们留下了另外两种情况:

  • IsWow64Process 存在,并产生TRUE->我们在64位计算机上
  • IsWow64Process 存在,并产生FALSE->我们在32位计算机上

我们不担心64位Windows上的64位应用程序产生FALSE的部分。我们知道我们的应用程序是32位的

哦,还有另外一种情况没有包含在此挑战中,因此无论如何都不应该发生:

  • IsWow64Process存在,但失败:我们默认为32位计算机。

这应该涵盖大多数Windows NT操作系统。仅在Win10 64位,Win 7 64位,Win 8.1 32位和WinXP SP1 32位上进行过测试


原始答案:

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

为了确保我们只需要区分两种情况

  • IsWow64Process 在kernel32.dll中不存在=>我们在32位计算机上。

  • IsWow64Process 确实存在=>我们在64位计算机上。

所提供的实际值IsWow64Process与此挑战无关,因为在任何情况下我们都希望二进制为32位。

与大多数答案不同,它不依赖于二进制本身在执行它的机器上进行编译。

如果我知道仅在64位而不是32位计算机上存在的较短功能,则可以缩短答案。


2
.dll从模块名称字符串中删除。这不仅对打高尔夫球有好处,而且实际上在正常使用中也是更好的做法。此外,出于打高尔夫球的目的,您可以在之后放置空格#include
科迪·格雷

谢谢,我实际上只是想通过在64位而不是32位上找到一个模块来减少整个工作量。我还在看 可悲的是(为此目的)没有称为WoW64的模块。
PaulPaulch

实际上有一个wow64.dllWow64Win.dll,但我从未尝试GetModuleHandle使用它们进行调用。但是,问题在于,它们只会为在64位计算机上运行的32位进程加载,而不会为在64 位计算机上运行的64位进程加载。
科迪·格雷

我有。即使在64位计算机上,它们也返回0。实际上是有道理的。它们不存在直接链接的条件。系统在运行时负责重定向。
PaulPaulch

哦,虽然有问题。从SDK文档中:“请注意,此技术不是检测操作系统是否为Windows 64位版本的可靠方法,因为当前32位Windows版本中的Kernel32.dll也包含此功能。”
科迪·格雷

7

C#,60 50字节

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

谢谢@TheLethalCoder


1
欢迎光临本站!:)
DJMcMayhem

4
如果删除“行”,则节省4个字节
John

1
也可以删除“环境”。和“控制台”。假设使用using static System.Environment;andusing static System.Console;
John

1
同样,更改WriteLineWrite
Thomas Ayoub

7
@John上次我检查时,必须包括导入内容,因此会增加字节数
Ceshion

6

Ruby,22个字节

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

["any string"].pack("p")返回一个字符串,该字符串的字节与指向的指针相对应;"any string"如果操作系统是64位,则返回8个字符;如果操作系统是32位,则返回4个字符。


由于这使用的是指针大小,因此当Ruby解释程序是64位OS上的32位二进制文​​件时,它将打印32位。因此错过了一条规则。
DarkDust

1
@DarkDust You can assume that users will use 64 bit software whenever possible.因此,将假定64位用户正在运行64位Ruby。
价值墨水

6

R,16个字节

.Machine[[18]]*8

返回指针大小。


1
与所有指针大小的解决方案一样,当程序是在64位OS上运行的32位二进制程序时,这将打印错误的结果。
DarkDust

1
@DarkDust R已解释,我们可以假设用户在可能的情况下使用64位软件,因此还假定使用64位解释器。恕我直言,该规则仅适用于编译语言
NieDzejkob

@NieDzejkob这就是我在PHP中使用相同的逻辑,当其他人对我的回答做出相同类型的评论时,我希望其他人从问题中读到的与假设用户将使用64-可能的话,还需要带解释性语言的位软件。
Bja

6

Perl,18 15 18字节

say length pack p8

64␤上了32位计算机,因为它perl是用64位IV构建的。在32位版本的Windows上运行时,通常会遇到这种情况。
布拉德·吉尔伯特b2gills

@ BradGilbertb2gills我将代码还原为以前的版本;即使在这种情况下,这也应该起作用。让我知道它是否仍然无法正常工作,我将删除答案。
Grimmy

1
可以正常工作。
布拉德·吉尔伯特b2gills

在HP 9000/785上似乎错误。给出32。但是我认为没有32位HP / PA-RISC CPU。
Ole Tange

6

x86机器码,8个字节

31 C0 B0 40 48 24 60 C3

取消高尔夫:

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

如果编译为64位可执行文件,则在中返回64 eax,如果编译为32 位可执行文件,则返回32(与操作系统无关)。

该答案取决于规则:

您可以假设用户将尽可能使用64位软件。


尽管这是一种有趣的方法,但如何以可以实际执行的方式将其写入程序?除了编写自己的加载程序功能之外,我想到的执行二进制代码的每种方法都使用特定于64位或32位代码的文件。因此,您需要此代码的两个副本才能实际运行...
Jules

@Jules您可以将它作为内联汇编放入高级语言程序中,例如此处。然后,您只需要使用本机平台的编译器及其默认选项,就可以解决问题。
Ruslan

@ l4m2你为什么对我大喊?但是无论如何,你是对的,这两个字节似乎是我实验留下的垃圾。将删除。
Ruslan

5

PHP,18字节

<?=PHP_INT_SIZE*8;

只要PHP_INT_SIZE是正确的,它就可以正确处理32、64和其他位CPU的所有情况,无论运行在哪个CPU PHP上,它都将显示CPU的精确大小!

如果PHP正在运行

32位操作系统PHP_INT_SIZE == 4

64位操作系统PHP_INT_SIZE == 8

16位操作系统PHP_INT_SIZE == 2(理论上)

8位操作系统PHP_INT_SIZE == 1(理论上也是)

128位操作系统PHP_INT_SIZE == 16(尚未实现,但可能)


2
该常量具有构建PHP而不是运行PHP的操作系统的大小
Einacio

2
@Einacio是的,但是在最初的挑战中,发帖人写道:“您可以假设用户将尽可能使用64位软件”,因此,如果操作系统为64位,则必须假定操作系统上运行的PHP版本为是64位!(注意:基于最初的挑战,我认为这不是纯粹的逻辑漏洞。)
Bja

4

C#(29个字节)

Console.Write(IntPtr.Size*8);

10
与所有指针大小的解决方案一样,当程序是在64位OS上运行的32位二进制程序时,这将打印错误的结果。
DarkDust

1
需要指定此选项是为“ AnyCPU”编译的,未选中“首选32位”复选框。
Cody Gray

4

电源外壳, 17 52个字节

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

如果满足以下任一条件,则返回64:

  • 您当前的驱动器上有一个目录,文件名以封闭的结尾结尾,目的是检测到Program Files (x86)
  • arch返回以4(ASCII 52)结尾的字符串like x86_64,而不是eg i686

try-catch的目的是避免在gci不返回任何值且没有arch的情况下遇到的错误。到目前为止,我还没有找到更短的方法。在ls上使用gci是因为在Linux上ls会产生可见错误。

此版本应检测操作系统是否是64位而不是仅PowerShell,并经过测试可在Windows和Linux上运行。要获得Mac支持,请替换archuname -m

以前的仅Windows版本: -!(ls \*`))*32+64


它在什么Linux发行版上运行?
tuskiomi

@tuskiomi哦,我的坏-我明白你的意思了。没有正确阅读挑战。我应该删除答案吗?
安迪

如果您知道它将与WINE一起使用,则应保留它。
tuskiomi

@tuskiomi至少是Ubuntu 14.04、16.04,RHEL7,CentOS7和某些版本的SUSE:github.com/PowerShell/PowerShell/releases-Xudonax
6

4

Swift 4 REPL / Playground,12个字节

Int.bitWidth

Int是字大小的,其作用方式Int32Int64取决于系统。


这不是代码片段,因此应该打印吗?还是说您正在使用REPL可以绕开该限制?
Lyndon White

1
这取决于法官。REPL的用法不是很常见,但是Swift Playgrounds非常受欢迎(尤其是在iPad上)。我个人认为这是公平的游戏。人们设计了用于高尔夫的自定义编程语言,这些语言隐式地打印出了价值,这没什么不同
Alexander

4

Ruby,10个字节

p 0.size*8

尽管Ruby可以使用任何长度的整数,但在内部它会将适合于机器字的值存储为Fixnum。该方法Fixnum#size始终以字节为单位返回机器字的长度。

Fixnum班的Ruby 2.4.0被删除,它的功能被列入类Integer。代码保持不变。


4

Shell,26个字节

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

您可以使用arch代替uname -m
丹尼斯,

1
@丹尼斯不一定。在macOS上:uname -m-> x86_64,但arch-> i386。因为macos :(同样,这是bash特定的-在zsh上失败
。– viraptor

@StevenPenny zsh将尝试将解释?为glob /单个字符通配符。
门把手

是否可以在Windows上运行?
Ajasja

1
@Ajasja和Cygwin
Steven Penny


4

C,22个字节

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

这是一个基于指针大小的答案,假定使用本机二进制。将转换0int**(address 0x0)。然后,我们将8加到0,在C中,该指针增加sizeof(int*)*8。4字节* 8位= 32,8 字节* 8位=64。因此,我们得到(int**)0x200x40,然后通过从隐式int返回函数返回它们将它们隐式转换为整数。

C,独立,34字节

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

C,与Unicode一起玩,30个代码点,34个字节(UTF-8)

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

我一直试图了解它是如何工作的,但我一无所知。您可以添加解释吗?
NieDzejkob

@jbcreix clever ...
NieDzejkob

3

Java,50个字节

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


那是图书馆吗?如果是的话,您应该提一下!但是,我在Oracle的JDK 8中没有看到该类(我没有可以使用的常规JDK 6和7,atm)。
奥利维尔·格雷戈尔

2
该答案无效。它不打印。
菲利普

6
引用丹尼斯(Dennis)的话:>它也说通常的代码适用高尔夫规则,并且从函数返回是我们I / O默认设置的一部分。
阿苏

将其更改为更少字节的lamba函数:()->com.sun.jna.Native.POINTER_SIZE*8
Ferrybig,2015年

3

PHP,29字节

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

https://3v4l.org/Y6JXv


哦 我喜欢这一个。它是如何工作的?
tuskiomi

4
php_uname('m')返回x86_6464位操作系统,否则类似i3864是字符串的第6个字符(索引第5个0)'4' - 4 == 0 == false。并且@仅抑制未加引号的字符串和未初始化偏移量的警告。
Petah

2
这将检测PHP的体系结构,而不是OS的体系结构。我在64位Windows上运行32位PHP,php_uname('m')return 'i586'
Gras Double

@GrasDouble好吧,我猜是ymmv,我为Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64
Petah

1
@tuskiomi,如果有8位操作系统,它将打印64
Bja

3

Python 3中77 84 71 59个字节

-13个字节,感谢@JonathanAllan!
由@Clearer降至59

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

在线尝试!

我的第一时间代码搜索:)
即使在64bit-OS上运行32Bit-Python时,也应该输出正确的版本。
假设platform.machine()给出i*86x86用于32Bit-OS。我没有人可以检查。输出是0OS不在64/32位时的情况
编辑:添加了print语句,因此它长了7个字节


不确定是否可以接受,因为可以在64位计算机上运行32位操作系统(或拥有称为a的计算机foo86,它是64位:p),但是如果可以接受,则可以保存9(编辑.. .13!)字节,带print((a==64)*a+32*(a==86))
Jonathan Allan

from platform import*;print({'4':64,'6':32}[machine()[-1]])也会工作。
清晰的时间为

@Clearer这将丢失以下约束: 重要说明:如果任何其他非空的字母数字字符字符串都不是32位或64位,则将其打印出来。
TOMATE

@tOmAtE如果它既不是32位也不是64位,它将抛出异常,并输出一个非空字符串。
清晰的

2
试试architecture(),保存字典:from platform import*;print(architecture()[0][:2])-> 50字节
bugmenot123
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.