Моя ОС 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-бітну версію інтерпретатора / і т.д., а 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 байт

Байт-код:

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

Це насправді, мабуть, веде, дуже приємно
тускіоми

1
Дуже акуратна ідея, але в міру реалізації, це поверне неправильне значення, якщо зібрати його як 32-бітну бінарну систему та працювати на 64-бітній операційній системі.
Коді Грей

@CodyGray з правил: Ви можете припускати, що користувачі будуть використовувати 64-бітове програмне забезпечення, коли це можливо. Я припускаю, що це також означає, що для функцій ми можемо припускати, що код абонента - 64 біт, коли це можливо.
Руслан

Ах, гадаю, це справедлива інтерпретація, @ Руслан. І я бачу, ви вже розмістили на увазі відповідь , чи не в цьому питанні. :-) Ви отримали мою нагороду.
Коді Грей

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

48

машинний код 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

Ця функція працює в Linux при використанні в ELF32, відповідно до i386 SysV ABI, а також у Windows / Wine при використанні в PE32, після дозволу на вимогу stdcall.


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

що це теоретично зробить у не 32/64 бітовому середовищі?
тускіоми

1
@tuskiomi У будь-якому випадку цей код все одно поверне або 32, або 64. Єдина відмінність інтерпретації цієї послідовності байтів у 16-бітному режимі - це зміна мнемоніки з eaxна ax. Отже, якщо у селектора csбуде 0x23результат, результат буде 64, інакше 32.
Руслан

це виглядає специфічно для двох конкретних операційних систем. Ви можете легко мати 32-бітну систему з cs = 0x23. Дивіться замість моєї 8-байтної відповіді, яка націлена на процесор.
peter ferrie

@peterferrie Так, тому я маю ще одну відповідь . Але ваш перевершує його на 2 байти.
Руслан

32

Математика, 17 байт

$SystemWordLength

13
Звичайно, є вбудований! \ s (+1)
тускіомі

Чи не слід додати &або вказати, що це є у відповіді?
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

Він перевіряє процесор і використовується для вибору потрібної операційної системи. Це в основному гольф-код з мого проекту для завантаження.
hildred

2
Таким чином він змінює ос на основі архітектури. Мислення поза коробкою. Мені подобається.
тускіоми

Який обхідний рахунок?
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
Roman Gräf

19

Джулія, 20 17 16 байт

n->Sys.WORD_SIZE

* Завдяки @LyndonWhite збережено 3 байти * Завдяки @ RomanGräf збережено байт

Попередні відповіді:

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

Спробуйте в Інтернеті!


1
Мені особисто це подобається!
тускіоми

2
Дотримуючись наступного конвенції: codegolf.meta.stackexchange.com/q/2419/62131, ви можете поголити 3 байти, виконуючи()->Sys.WORD_SIZE
Ліндон Уайт

1
Ви також можете скористатись фіктивним аргументом: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

14

JavaScript (Node.js), 24 байти

_=>process.arch.slice(1)

Це функція і повертає '32', '64'або якщо ні один 'rm'.


+1, але я вважаю, що 64-бітна арка могла б мати 32-бітну ОС
восьминога

1
Дає мені "32" у 32-розрядної Windows, тому вона, здається, працює.
Кен ІН

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

Це повертає архітектуру ОС, яку звітував процес, а не власне архітектуру ОС. Отже, це не працює в Linux. (Забийте «сетарху» улюблену пошукову систему.)
Девід Шварц

@DavidSchwartz це прекрасно працює на моєму linux box, якщо я не розумію, але на PPCG ми можемо припустити незмінене середовище з точки зору того, що користувач міняє арку
Downgoat

13

C, 33 31 29 23 байт

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

Дякуємо коментаторам @ceilingcat та @Dennis за поради щодо гольфу!


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

11
Хіба це не залежатиме від того, складений ви як 32 або 64 бітова програма?
Кен ІН

4
Це не відповідає вимогам. " Зверніть увагу, що 32-бітна програма, що працює на комп'ютері з 64-бітовою операційною системою, повинна виводити" 64 " .
Девід Шварц

2
@DavidSchwartz "Ви можете припускати, що користувачі будуть використовувати 64-бітове програмне забезпечення, коли це можливо."
Klas Lindbäck

2
Вибачте, що сказати, але розмірof оцінюється під час компіляції. Отже, якщо ви компілюєте 32-бітний exe і запускаєте його на 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 всіх ОС - це навіть не просто зараз встановити у VM (повірте, я намагався. Я не збираюся працювати на KVM, і він має цікаву взаємодію з адаптерами дисплея VBox) . (Також у нього навіть немає 64-бітної концепції ... це справді смішна вимога.)
Боб

1
@ ub3rst4r Сумніваюся, що всі інтерпретовані мови програмування мають реалізацію, що працює на Windows 4.10!
Мартін Розенау

1
Схоже, це не виходить, якщо це 32-бітна оболонка на 64-бітній ОС.
Кріс Дж

@ChrisJ Принаймні, на Win10 та Win2012 R2 він повертає належний результат від x86 PowerShell. Не перевірений на Linux.
Booga Roo

10

Python 2, 52, 48, 42 41 байт

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

Дякую абсолютно нелюдському!


масштабування! через лінію за хвилину.
тускіоми

Я буду затримуватися на тестуванні цього, поки я не вдома, але я не впевнений, що це роздруковує "32" і "64", але в інших випадках я впевнений.
тускіоми

@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 ...?
Кен ІН

1
Що з використанням стенограми? if EXIST "c:\Progra~3" (echo 64)else echo 32За замовчуванням у вас є, ProgramDataі Program Filesтому, якщо існує третя частина, ми повинні бути 64
Марі

3
Що буде друкувати для 8-бітної ОС?
tuskiomi

7

C, API Win32, 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-бітним виконуваним файлом. І це опис того, що буде в параметрі outIsWow64Process

Вказівник на значення, яке встановлено на TRUE, якщо процес працює під WOW64. Якщо процес працює в 32-розрядної Windows, для параметра встановлюється значення FALSE. Якщо процес - це 64-розрядний додаток, що працює під 64-бітною Windows, значення також встановлюється на FALSE.

Це залишає два додаткові випадки:

  • IsWow64Process існує, і виходить ПРАВИЛЬНА -> Ми на 64-бітній машині
  • IsWow64Process існує, і приносить помилку -> Ми на 32-бітній машині

Ми не турбуємося про частину, де 64-розрядний додаток для 64-бітної Windows дає FALSE. Як ми знаємо, що наш додаток є 32-розрядним

О, і є ще один випадок, який не охоплюється цим викликом і має бути рідкісним:

  • IsWow64Process існує, але він не вдається: Ми встановили за замовчуванням 32-бітну машину.

Це має охоплювати більшість операційних систем Windows NT. Пройшли тестування лише на 64-розрядному Win10 64, Bit 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 байти, якщо ви видалите "Рядок"
Джон

1
можна також видалити "Навколишнє середовище". і "консоль". припускаючи використання using static System.Environment;таusing static System.Console;
Джон

1
також змініть WriteLineнаWrite
Thomas Ayoub

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.
Значення чорнила

6

R, 16 байт

.Machine[[18]]*8

Повертає розмір вказівника.


1
Як і всі рішення розміру вказівника, це дозволить надрукувати неправильний результат, коли програма є 32-розрядним бінарним файлом, що працює на 64-бітній ОС.
DarkDust

1
@DarkDust R інтерпретується, і ми можемо припустити, що користувач використовує 64-бітове програмне забезпечення, де це можливо, так само 64-розрядний інтерпретатор. IMHO, правило стосується лише компільованих мов
NieDzejkob

@NieDzejkob Саме таку ж логіку я використав для своєї відповіді в PHP, коли хтось інший поставив такий же коментар у відповідь на мою відповідь, я б хотів, щоб інші читали те ж саме з питання, що і у нас, за умови, що користувачі будуть використовувати 64- бітове програмне забезпечення, де можливо, з інтерпретованими мовами.
Бья

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

Безголівки:

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 Ви можете розмістити це як вбудовану збірку в мовну програму високого рівня, як тут . Тоді вам просто потрібно використовувати свій власний платформи-компілятор з його типовими параметрами, і ви отримаєте шматочки.
Руслан

@ l4m2, чому ти кричиш на мене? Але ви все одно маєте рацію, ці два байти, здається, залишаються від моїх експериментів. Буде видалено.
Руслан

5

PHP, 18 байт

<?=PHP_INT_SIZE*8;

Це правильно обробляє всі випадки 32, 64 та інших бітових процесорів за умови правильності PHP_INT_SIZE, він покаже точний розмір процесора незалежно від того, на якому PHP працює CPP!

Якщо 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-бітним! (Примітка. Я не вважаю це лазівкою просто чистою логікою, що ґрунтується на початковому виклику.)
Бжа

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, на відміну від напр i686.

Спробний улов призначений для обходу помилки, яку ви отримуєте, якщо gci нічого не повертає, а у вас немає арки . Я поки не знайшов коротшого способу зробити це. gci використовується більше ls, оскільки в Linux, ls видасть видиму помилку.

Ця версія повинна визначити, чи є ОС 64-бітною, а не просто PowerShell, і чи тестується вона для роботи в Windows та Linux. Для підтримки Mac замініть archна uname -m.

Попередня версія для Windows: -!(ls \*`))*32+64


на якому Linux працює цей дистрибутив?
tuskiomi

@tuskiomi О, мій поганий - я бачу, що ти маєш на увазі. Не вичитав виклик належним чином. Чи слід видалити відповідь?
Енді К.

Якщо ви знаєте, що це буде працювати з WINE, вам слід зберегти його.
тускіомі

@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 дуже популярні (особливо на 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
@Dennis Не обов’язково. На macos: 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-воротної функції.

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


Це бібліотека? Якщо так, то слід згадати про це! Я не бачу цього класу, доступного в JDK 8 Oracle (я не маю в своєму розпорядженні звичайними JDK 6 і 7, атм).
Олів'є Грегоар

2
Ця відповідь недійсна. Він не друкується.
Філіпп

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

Змініть його на функцію " ()->com.sun.jna.Native.POINTER_SIZE*8
ламба"

3

PHP, 29 байт

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

https://3v4l.org/Y6JXv


О-о. Мені це подобається. Як це працює?
тускіомі

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

2
Це виявляє архітектуру PHP, а не ОС. Я працюю 32-бітний PHP в 64-розрядної Windows, php_uname('m')повертається 'i586'.
Гра "Двомісний"

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

1
@tuskiomi це надрукує 64, якщо є 8-бітна операційна система
Bja

3

Пітон 3 , 77 84 71 59 байт

-13 байт, спасибі @JonathanAllan!
Вниз до 59 від @Clearer

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

Спробуйте в Інтернеті!

Мій кулачок з тимчасовим кодом для гольфу :)
Слід виводити правильну версію навіть під час роботи 32Bit-Python на 64bit-OS.
Припустимо, що platform.machine()дає i*86або x86для 32Bit-OS. У мене немає такого, щоб це перевірити. Вихід - це 0коли ОС не знаходиться в 64 / 32Bit
Edit: Додано операцію друку, тому вона отримала на 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

@tOmAtE якщо він не є ні 32, ні 64 бітом, він видасть виняток, який друкує не порожню рядок.
Чіткіший

2
Спробуйте архітектуру (), зберігає dict: from platform import*;print(architecture()[0][:2])-> 50 байт
bugmenot123
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.