Моя ОС 32-битная или 64-битная?


53

Это уже не так важно, но иногда кому-то нужно знать.

Вот простой пример: не вводя пользователя, скажите, работает ли компьютер, на котором выполняется код, в 64-битной операционной системе или 32-битной операционной системе!

Если код выполняется в 32-разрядной операционной системе, выведите «32», если код выполняется в 64-разрядной операционной системе, выведите «64». Важное замечание: Напечатайте любую другую непустую строку буквенно-цифровых символов, если она не 32- или 64-разрядная.

Обратите внимание, что 32-разрядная программа, работающая на компьютере с 64-разрядной операционной системой, должна выдавать «64». Вы можете предположить, что пользователи будут использовать 64-битное программное обеспечение, когда это возможно.

Чтобы иметь право на участие, ваш код должен быть в состоянии работать в Windows 4.10 или более новых системах Windows, поддерживаемых Microsoft, и по крайней мере один вариант Linux на ваш выбор (при условии, что этот вариант предоставляется бесплатно). Могут быть установлены моды совместимости, при условии, что программа все еще возвращает правильное значение.

Применяются обычные правила .

Примечание. Если ваш ответ предназначен только для распечатки 32 или 64, но не для альтернативного случая, я приму его, но это не конкурирующий ответ.

Я постараюсь позже опубликовать некоторые результаты запуска этих кодов на разных ОС!


5
Поэтому «Обратите внимание, что 32-разрядная программа, работающая на компьютере с 64-разрядной операционной системой, должна выводить« 64 ». Вы можете предполагать, что пользователи будут использовать 64-разрядное программное обеспечение, когда это возможно». означает, что если интерпретатор / компилятор и т. д. доступен как в 32-битной, так и в 64-битной версии, то 32-битная ОС всегда будет запускать 32-битную версию интерпретатора / etc, а 64-битная ОС всегда будет запускать 64-битный интерпретатор. /и т.д. Поэтому беспокоиться о разнице между программой, имеющей 32 или 64, и ОС, являющейся 32 или 64, в основном является проблемой только для языков с 32-битными реализациями. Правильно?
Линдон Уайт

2
Многие решения здесь выдают «32» в 64-битной ОС, если для компиляции программы используется 32-битный компилятор. Это нормально?
Мартин Розенау

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 или более поздней версии ?
Деннис

Ответы:


44

Сборка x86 (полиглот), 13 байт

Bytecode:

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

Определяет функцию, которая возвращает 32, если интерпретируется как 32-разрядная, 64, если 64-разрядная, и 32767, если 16-разрядная.

Я хотел создать полиглот, работающий на 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. И я вижу, вы уже опубликовали ответ, который я имел в виду , если бы не эта проблема. :-) У тебя есть мой голос.
Коди Грей

байт 48представляет dec %eaxв 16-битном режиме?
phuclv

48

машинный код x86, 12 байт

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

Эта функция работает в Linux при использовании в ELF32, после i386 SysV ABI, а также в Windows / Wine при использовании в PE32, в соответствии с stdcallсоглашением о вызовах.


На самом деле можно уменьшить количество байтов еще больше, если следовать другому подходу .
Руслан

что бы это теоретически сделать в не 32/64 битной среде?
Tuskiomi

1
@tuskiomi В любом случае этот код по-прежнему будет возвращать 32 или 64. Единственное отличие интерпретации этой последовательности байтов в 16-битном режиме - это изменение мнемоники с eaxна ax. Так что, если селектор в, csоказывается 0x23, результат будет 64, в противном случае 32.
Руслан

это выглядит специфично для двух конкретных операционных систем. Вы можете легко получить 32-битную систему с cs = 0x23. Вместо этого посмотрите мой 8-байтовый ответ, который нацелен на процессор.
Питер Ферри

@peterferrie да, поэтому у меня есть другой ответ . Но ваш превосходит его на 2 байта.
Руслан

32

Mathematica, 17 байт

$SystemWordLength

13
Конечно, есть встроенный! \ s (+1)
tuskiomi

Не следует ли вам добавить &или указать, что это в 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 не имеет простых возможностей отображения текста, поэтому меню злоупотребляет.


Я не уверен, что вы можете сказать разрешение
ОС

Он проверяет процессор и используется для выбора правильной операционной системы. Это в основном код от моего проекта unboot.
Хильдред

2
Так что это меняет ОС на основе архитектуры. Нестандартное мышление. Мне нравится.
Tuskiomi

Какой у вас счет?
Restioson

1
@hildred Я считаю , что было бы более удобным для чтения , если вы использовали ## iPXE, 36 bytesвместо### ipxe 36
NieDzejkob

21

Юлия 14 13 байт

n->8sizeof(1)

Объясните:

  • Функция Anon, принимающая что-либо (включая nothing), возвращающая целое число 32 или 64
  • Целочисленные литералы имеют тип, Intкоторый в зависимости от того, 32-битный или 64-битный, являетсяInt32 или Int64(1 может быть любая цифра)
  • размещение числа перед вызовом функции делает умножение сопоставления
  • Это в основном минимизированная версия кодаSys.WORD_SIZE , используемая в ответе rahnema1

Другой забавный ответ ()->"$(Int)"[4:5], но я не могу подсчитать это.


-1 благодаря @Roman Gräf


Вы можете использовать фиктивный аргумент: codegolf.meta.stackexchange.com/a/12696/56341
Роман

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
Линдон Уайт

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» на 32-битной Windows, так что, похоже, работает.
Кен YN

5
Вы можете сбрить 7 байтов, если используете REPL и osвместо process:os.arch().slice(1)
GilZ

Это возвращает архитектуру ОС, сообщенную процессу, а не фактическую архитектуру ОС. Так что это не работает в Linux. (Вставьте «setarch» в ваш любимый поисковик.)
Дэвид Шварц

@DavidSchwartz отлично работает на моей Linux-коробке, если я не понимаю, но на PPCG мы можем предполагать неизмененную среду с точки зрения изменения пользователем арки
Downgoat

13

C, 33 31 29 23 байта

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

Спасибо комментаторам @ceilingcat и @Dennis за советы по игре в гольф!


13
В нем также говорится, что применяются обычные правила игры в код, и возвращение из функции является частью наших значений по умолчанию для ввода / вывода.
Деннис

11
Разве это не будет зависеть от того, компилируете ли вы как 32- или 64-битную программу?
Кен YN

4
Это не соответствует требованиям. « Обратите внимание, что 32-разрядная программа, работающая на компьютере с 64-разрядной операционной системой, должна выводить« 64 ». » Это говорит о том, как была скомпилирована программа, а не о том, что представляет собой ОС.
Дэвид Шварц

2
@DavidSchwartz «Вы можете предположить, что пользователи будут использовать 64-битное программное обеспечение, когда это возможно».
Клас Линдбек

2
Извините, что сказал, но sizeof оценивается во время компиляции. Поэтому, если вы скомпилируете 32-битный исполняемый файл и запустите его на 64-битном компьютере, он выдаст 32, а должен вывести 64 ( stackoverflow.com/questions/2615203/… ). Хорошая идея, хотя!
Динаиз

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 из всех ОС - в наши дни это даже не просто установить на ВМ (поверьте мне, я пробовал. Не буду работать на KVM, и у него есть интересные взаимодействия с адаптерами дисплея VBox) , (И при этом у него даже нет понятия 64-битного ... это действительно нелепое требование.)
Боб

1
@ ub3rst4r Я сомневаюсь, что у всех интерпретируемых здесь языков программирования есть реализация, работающая на Windows 4.10!
Мартин Розенау

1
Это выглядит как сбой, если это 32-битный PowerShell на 64-битной ОС.
Крис 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, это печатает "32 бита" или "64 бита"
Даниэль

1
from struct import*;print calcsize("P")*8короче
полностью человек

12
Если вы запустите это на 32-битном Python в 64-битной ОС, я думаю, что это будет вам лгать. Большинство других ответов также кажутся чувствительными к этому в любом случае ...
Ник Т

10

Java 8, 45 байт

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

@Dopapp Что он (а) имеет в виду, что это фрагмент, а не программа или функция. В Java 8 это должно работать:n=>System.getProperty("os.arch")
NoOneIsHere

@NoOneIsHere, о, спасибо, что прошел через мою голову
Даниэль

2
«Если код выполняется в 32-разрядной операционной системе, выведите« 32 », если код выполняется в 64-разрядной операционной системе, выведите« 64 ». Выведите любую (другую) непустую строку буквенно-цифровых символов, если она ни. ". Это совсем не так ...
Оливье Грегуар

4
Можете ли вы получить Java 8 для Windows 98 (v4.10)?
TessellatingHeckler

4
@TessellatingHeckler Java 8 требует «i586» (что бы это ни значило). Запись гласит: «Ваш код должен быть в состоянии работать в Windows 4.10 или новее», а не «Ваш код должен быть в состоянии работать в Windows 4.10 и новее». Он работает на Windows новее .
Оливье Грегуар,


8

Windows CMD, 56 52 байта (спасибо, Боб!)

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

Все еще удивительно длинный - самый длинный до сих пор!


1
На самом деле, %windir%\SysWOW64даже короче, я думаю ...
Боб

7
« Должен быть в состоянии работать на Windows 4.10 или более новой версии и, по крайней мере, один вариант Linux на ваш выбор » - какой вариант Linux для этого?
TessellatingHeckler

1
@TessellatingHeckler, если вы устанавливаете Wine ...?
Кен YN

1
Как насчет использования стенографии? if EXIST "c:\Progra~3" (echo 64)else echo 32По умолчанию у вас есть, ProgramDataи Program Filesпоэтому, если третий существует, мы должны быть 64
Мари

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-битным исполняемым файлом. И это описание того, что будет в выходной параметрIsWow64Process

Указатель на значение, установленное в значение ИСТИНА, если процесс выполняется под WOW64. Если процесс выполняется под 32-битной Windows, значение устанавливается в FALSE. Если процесс представляет собой 64-битное приложение, работающее под 64-битной Windows, значение также устанавливается в FALSE.

Это оставляет нас с двумя дополнительными случаями:

  • IsWow64Process существует и выдает TRUE -> Мы находимся на 64-битной машине
  • IsWow64Process существует и выдает FALSE -> Мы находимся на 32-битной машине

Мы не беспокоимся о той части, где 64-битное приложение в 64-битной Windows дает 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;}

Чтобы быть уверенным, мы должны различать только 2 случая

  • IsWow64Process не существует в kernel32.dll => Мы находимся на 32-битной машине.

  • IsWow64Process действительно существует => Мы находимся на 64-битной машине.

Фактическое значение, предоставленное IsWow64Process имеет значения для этого вызова, поскольку мы хотим, чтобы двоичный файл был 32-разрядным в любом случае.

В отличие от большинства ответов, это не связано с тем, что сам двоичный файл компилируется на компьютере, на котором он выполняется.

Если бы я знал более короткую функцию, которая присутствует только на 64-битных, а не 32-битных машинах, я мог бы сократить ответ.


2
Удалите .dllиз имени модуля строку. Это не только хорошо для игры в гольф, но и для нормальной практики. Кроме того, в целях игры в гольф, вы можете оставить место после #include.
Коди Грей

Спасибо, я действительно хотел уменьшить все это, просто ища модуль, который можно найти на 64-битной, но не на 32-битной. Я все еще ищу. К сожалению (для этой цели) нет модуля под названием WoW64.
MrPaulch

На самом деле есть wow64.dllи Wow64Win.dll, но я никогда не пытался звонить GetModuleHandleс такими. Проблема, однако, заключается в том, что они будут загружаться только для 32-разрядного процесса, выполняющегося на 64-разрядной машине, а не для 64-разрядного процесса, выполняющегося на 64-разрядной машине.
Коди Грей

У меня есть. Они возвращают 0 даже на 64-битной машине. Имеет смысл на самом деле. Они не существуют, чтобы быть связанными напрямую. Система заботится о перенаправлении во время выполнения.
MrPaulch

Ох, проблема, хотя. Из документации SDK: «Обратите внимание, что этот метод не является надежным способом определения того, является ли операционная система 64-разрядной версией Windows, поскольку Kernel32.dll в текущих версиях 32-разрядной Windows также содержит эту функцию».
Коди Грей

7

C #, 60 50 байт

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

Спасибо @TheLethalCoder


1
Добро пожаловать на сайт! :)
DJMcMayhem

4
Сохраните 4 байта, если вы удалите «Line»
John

1
также можно удалить «Окружающая среда». и «консоль». при условии использования using static System.Environment;иusing static System.Console;
Джон

1
Кроме того, изменить WriteLineнаWrite
Томас

7
@John В прошлый раз, когда я проверял, импорт должен быть включен и поэтому добавил бы к количеству байтов
Ceshion

6

Рубин, 22 байта

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

["any string"].pack("p")возвращает строку, байты которой соответствуют указателю, который указывает на "any string", и составляет 8 символов, если ОС является 64-разрядной, или 4 символа, если ОС является 32-разрядной.


Поскольку при этом используется размер указателя, он будет печататься 32-разрядным, когда интерпретатор Ruby является 32-разрядным двоичным файлом в 64-разрядной ОС. Так что пропускает правило.
DarkDust

1
@DarkDust You can assume that users will use 64 bit software whenever possible.Итак, предполагается, что 64-битные пользователи используют 64-битный Ruby.
Value Ink

6

R, 16 байт

.Machine[[18]]*8

Возвращает размер указателя.


1
Как и во всех решениях с размером указателя, это выдает неверный результат, когда программа представляет собой 32-разрядный двоичный файл, работающий в 64-разрядной ОС.
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.
Оле Танге

6

машинный код x86, 8 байт

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

Если скомпилирован как 64-битный исполняемый файл, он возвращает 64 в eax , а если скомпилирован как 32-битный, то возвращает 32 - независимо от ОС.

Этот ответ опирается на правила, гласящие:

Вы можете предположить, что пользователи будут использовать 64-битное программное обеспечение, когда это возможно.


Хотя это интересный подход, как его можно записать в программу таким образом, чтобы он действительно мог быть выполнен? Каждый способ, которым я могу придумать выполнение двоичного кода, кроме написания собственной функции загрузчика, использует файлы, специфичные для 64-битного или 32-битного кода. Следовательно, вам понадобятся две копии этого кода, чтобы на самом деле запустить ...
Жюль

@Jules Вы можете поместить его как встроенную сборку в языковую программу высокого уровня, как здесь . Тогда вам просто нужно использовать свой компилятор с платформой с его опциями по умолчанию, и вы получите битность.
Руслан

@ l4m2 почему ты кричишь на меня? Но в любом случае вы правы, эти два байта, похоже, остались от моих экспериментов. Удалит.
Руслан

5

PHP, 18 байт

<?=PHP_INT_SIZE*8;

Это правильно обрабатывает все случаи 32, 64 и других битовых процессоров, при условии, что PHP_INT_SIZE верен, он покажет точный размер процессора независимо от того, на каком процессоре работает PHP!

Если 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, а не запущен
Einacio

2
@Einacio Да, но в первоначальном конкурсе автор написал: «Вы можете предполагать, что пользователи будут использовать 64-битное программное обеспечение, когда это возможно». Поэтому, если ОС 64-битная, то версия PHP, работающая в этой ОС, должна быть принята за быть 64-битным! (Примечание: я не рассматриваю это как лазейку, просто чистая логика, основанная на первоначальном вызове.)
Bja

4

C # (29 байт)

Console.Write(IntPtr.Size*8);

10
Как и во всех решениях с размером указателя, это выдает неверный результат, когда программа представляет собой 32-разрядный двоичный файл, работающий в 64-разрядной ОС.
DarkDust

1
Нужно указать, что это скомпилировано для «AnyCPU» с снятым флажком «Предпочитать 32-битный».
Коди Грей

4

PowerShell, 17 52 байта

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

Возвращает 64, если выполняется одно из следующих условий:

  • У вас есть каталог на вашем текущем диске с именем файла, оканчивающимся на близком конце, идея состоит в том, чтобы обнаружить Program Files (x86).
  • archвозвращает строку, заканчивающуюся на 4(ASCII 52), например x86_64, в отличие от eg i686.

Try -catch предназначен для обхода ошибки, которую вы получаете, если gci ничего не возвращает и у вас нет арки . Я не нашел более короткий способ сделать это до сих пор. gci используется поверх ls, потому что в Linux ls выдаст видимую ошибку.

Эта версия должна определять, является ли ОС 64-разрядной, а не только PowerShell, и протестирована для работы в Windows и Linux. Для поддержки Mac замените archна uname -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

4

Swift 4 REPL / Детская площадка, 12 байт

Int.bitWidth

Intимеет размер слова, действует как один Int32или в Int64зависимости от системы.


Разве это не фрагмент кода, поэтому он должен напечатать? Или говорят, что вы используете REPL, чтобы обойти это ограничение?
Линдон Уайт

1
Это зависит от судей. Использование REPL не очень распространено, но Swift Playgrounds очень популярны (особенно на iPad). Лично я считаю, что это честная игра. Люди проектируют собственные языки программирования для игры в гольф, которые неявно печатают значения, и это ничем не отличается
Александр

4

Рубин, 10 байт

p 0.size*8

Хотя Ruby может использовать целые числа любой длины, внутри он хранит значения, которые вписываются в машинное слово как Fixnum. Метод Fixnum#sizeвсегда возвращает длину в байтах машинного слова.

FixnumКласс был удален в Руби 2.4.0, его функциональность была включена в классе Integer. Код стоит.


4

Оболочка, 26 байт

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

Вы можете использовать archвместо uname -m.
Деннис

1
@ Денис Не обязательно. На макросах: uname -m-> x86_64, но arch-> i386. Потому что macos :( Кроме того, это зависит от bash - не работает на zsh.
viraptor

@StevenPenny zshпопытается интерпретировать ?подстановочный знак как глобальный / односимвольный.
Дверная ручка

Это работает на Windows?
Аяся

1
@ Ajasja с Cygwin
Стивен Пенни


4

C, 22 байта

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

Это ответ на основе размера указателя, который предполагает собственный двоичный файл. Приведение 0к int**(адрес 0x0). Затем мы добавляем 8 к 0, что в C продвигает указатель на sizeof(int*)*8. 4 байта * 8 битов = 32, 8 байтов * 8 битов = 64. Таким образом, мы получаем (int**)0x20и0x40 которые затем неявно преобразуются в целые числа, возвращая их неявноint -returning функции.

C, автономный, 34 байта

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

C, забавно с Unicode, 30 кодовых точек, 34 байта (UTF-8)

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

Я пытался понять, как это работает, но я ничего не понимаю. Можете ли вы добавить объяснение?
NieDzejkob

@jbcreix умный ...
NieDzejkob

3

Java, 50 байт

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


Это библиотека? Если да, вы должны упомянуть об этом! Однако я не вижу этого класса в Oracle JDK 8 (у меня нет моих обычных JDK 6 и 7, атм).
Оливье Грегуар

2
Этот ответ неверен. Это не печатает.
Филипп

6
Цитата Денниса:> В нем также говорится, что применяются обычные правила игры в код, и возвращение из функции является частью наших значений по умолчанию для ввода / вывода.
Асу

Измените его на функцию lamba для меньшего количества байтов:()->com.sun.jna.Native.POINTER_SIZE*8
Ferrybig

3

PHP, 29 байт

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

https://3v4l.org/Y6JXv


Ooh. Мне нравится этот. Как это работает?
Tuskiomi

4
php_uname('m')возвращает x86_64на 64-битную ОС, иначе что-то вроде i386. 4будучи шестым символом (пятые 0 индексируются) строка, '4' - 4 == 0 == false. И @просто подавляет предупреждения для строк без кавычек и неинициализированных смещений.
Петах

2
Это определяет архитектуру PHP, а не ОС. Я запускаю 32-битный PHP на 64-битной Windows, php_uname('m')возвращается 'i586'.
Двойной Гра

@GrasDouble хорошо, я думаю, ммм, я работаю на меня Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64.
Петах

1
@tuskiomi это напечатает 64, если есть 8-битная операционная система
Bja

3

Python 3 , 77 84 71 59 байт

-13 байт, спасибо @JonathanAllan!
До 59 по @Clearer

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

Попробуйте онлайн!

Мой первый раз код игры в гольф :)
Должен выводить правильную версию даже при работе 32Bit-Python на 64-битной ОС.
Предположим, platform.machine()дает i*86или x86для 32-битной ОС. У меня нет одного, чтобы проверить это. Вывод происходит, 0когда ОС не в 64/32-битном режиме.
Редактирование: добавлен оператор печати, поэтому он получил на 7 байт больше


Не уверен, что это приемлемо, потому что можно запустить 32-битную ОС на 64-битной машине (или иметь какую-нибудь машину с именем a, foo86которая является 64-битной: p), но если это приемлемо, вы можете сохранить 9 (правка .. .13!) Байт с print((a==64)*a+32*(a==86)).
Джонатан Аллан

from platform import*;print({'4':64,'6':32}[machine()[-1]])будет работать тоже.
Яснее

@Clearer В этом случае будет пропущено следующее ограничение: Важное замечание: Выведите любую другую непустую строку буквенно-цифровых символов, если она не является ни 32-разрядной, ни 64-разрядной. ,
ВРЕМЯ

@tOmAtE, если он не 32- и 64-битный, он выдаст исключение, которое печатает непустую строку.
Яснее

2
Попробуйте архитектуру (), from platform import*;print(architecture()[0][:2])
сохраняя
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.