Де корисні восьмерики? [зачинено]


36

Я просто вдарив головою об стіл хвилин 20, дивлячись на абсолютно дивну помилку в PHP, і тоді я зрозумів, що є восьмеричний. Вісімка <% (* & #>).

Коротше кажучи, я проклав декілька літералів нулями, щоб код вирівнявся, я знаю, велика помилка. Забули про вісімки.

Питання в тому, чи хтось використовує восьмерики для чогось іншого, крім дозволів на файли? (Особисто я вважаю за краще, chmod ugo+rwxале розумію, що якщо вони повинні бути програмно створені, корисно використовувати восьмерики.) Але чи корисні вони в будь-якій іншій ситуації?


16
Варіант А: Звинувачуйте себе. Варіант В: звинувачуйте світ. Варіант С: посміхнутися, коли ви чогось навчилися.
робота

12
@Petrozza - ІМО, використання С-стилю провідного нуля для позначення восьмикутника ніколи не було вдалим вибором, але це історія - можливо, трохи спадщини С, хоча це може бути навіть старше. Я думаю, що в Ада є одна з кращих конвенцій - восьмічне число буде записане 8 # 1234567 #, шістнадцяткове число 16 # abcdef # і т. Д., А провідні нулі - це лише ведучі нулі - будь-яка база від 2 до 16 (принаймні) є дійсною , і всі вони візуально очевидні і легко зрозуміти.
Steve314

2
@Petruza Ваше запитання в первісному вигляді не було конструктивним для цього веб-сайту, і воно було покращене громадою, щоб воно могло залишатися відкритим: будь ласка, перегляньте поширені запитання для отримання додаткової інформації про те, чому це роблять люди та чому ми заохочуємо це. Якщо у вас є якісь додаткові запитання чи сумніви, будь ласка, піднімайте їх на нашому сайті для мета-обговорень , а не у своєму питанні.

11
Варіант D: "звинувачуйте PHP" - це завжди правильний вибір, незалежно від проблеми
Головоногі

2
@ Steve314 Я повністю згоден. Ще одним примітним прикладом є Python , де вони мають 0oпрефікс (що відповідає 0xі , 0bале , можливо, трохи важко відрізнити від 00). А оскільки Python 3, додаткові провідні нулі повторюють помилку синтаксису для запобігання подібних помилок.
5gon12eder

Відповіді:


42

За даними Вікіпедії , восьмерики не такі поширені, як раніше. Як уже згадували інші, в минулому системи раніше мали 12/24/36-бітове слово, яке легше представити у восьмеричному розмірі, ніж шістнадцятковий, але в даний час архітектури x86 та i64 використовують біт 16/32/64 слово, яке легше представлено шістнадцятковим і прямо потворним у вісімці.

Однак, поточне використання включає:

Зауважте, що сучасні мови програмування іноді більше не підтримують восьмерики через відсутність випадків використання та потенційних помилок. C # - приклад, як Ерік Ліпперт писав це в третьому та четвертому виданнях TCPL :

C # не підтримує восьмеричні літерали з двох причин. По-перше, навряд чи хтось користується восьмеричними буквами в ці дні. По-друге, якщо C # підтримує восьмигранник у стандартному форматі "провідний нуль означає восьмеричний", то це було б потенційним джерелом помилок. Розглянемо цей код:

    FlightNumber = 0541;

Очевидно, що цей вираз призначений як десятковий буквальний, а не восьмеричний буквальний.

Прихований , і лише для довідки та цікавості, Код, прихована мова комп'ютерного обладнання має чудове легко простеження пояснень у восьмеричних та інших системах числення на стор. 55 - 63 .


1
На цій замітці слідкуйте за Javascript під час обробки вводу користувача. parseInt(011)==9
Дарієн

3
Це справді цікаво про Юкі та Памеану. Мені просто прийшло в голову, що підрахунок пальця в шістнадцятці є досить простим, якщо використовувати внутрішню частину кожного пальця, використовуючи певну варіацію, як це
ocodo

@Slomojo - ти можеш порахувати до 99 на пальцях , насправді ...
detly

3
+1 за дуже вичерпну відповідь. Грейс Хоппер якось сказала, що у неї проблеми з балансуванням чекової книжки, тому що вона настільки досвідчена при додаванні восьмерики.
Macneil

14
@detly, якщо я знаю, що мені потрібно рахувати великі числа, я буду використовувати свої 10 цифр як біти і рахувати до 1024 просто пальцями (будьте обережні, кому ви показуєте №4, № 128 та # 132 до).
zzzzBov

17

Octal широко використовувався близько 50 років тому Digital Equipment Corp. (DEC) та іншими компаніями, у яких були комп'ютери з 12-бітним словом (наприклад, PDP-8) або інші кратні шість, наприклад, 18 і 36 (наприклад, UNIVAC 1108 ). Я використовував і PDP-8, і UNIVAC 1108 в школі. Символи в обох машинах зазвичай використовують шість біт, а не 8.

Формат інструкцій PDP-8

Формат інструкцій PDP-8 - зауважте, що біти пронумеровані 0 -> 11. Біт 0 був MSB (найзначніший біт).

Коли DEC вийшов з 16-бітним PDP-11, вони продовжували використовувати восьмигранник у своїй документації замість шістнадцяткових, як це використовували інші виробники мінікомп'ютерів, що виходили з 16-бітовими машинами на той час. Ймовірно, це було через кілька 3-бітних полів у форматах інструкцій PDP-11, таких як Реєстр, Режим та Src / Dest, які піддаються декодуванню у вигляді восьмеричної цифри. (Дякую Джону Строму за те, що вказав на це.)

Цікаво, що коли Motorola вийшла зі своїм мікропроцесором 68000, на який сильно впливав PDP-11 і мала однакові 3-бітні поля Mode та Register в інструкціях, вони вирішили використовувати в своїй документації лише шістнадцятковий.

Оскільки PDP-11 використовував восьмеричні позначення, оригінальні коди дозволів для Unix, які вперше з'явилися на PDP-11, також використовували восьмерику. Ця спадщина зберігається в Linux, де команда chmod все ще використовує octal, щоб вказати кожне з трьох бітових полів 'rwx'.

Ще кілька дрібниць - CompuServe, який широко використовувався комутованим онлайн-сервісом у 1980-х та на початку 1990-х (до того, як затінив AOL), натрапив на міні-комп'ютери DEC, принаймні, спочатку. Усі ідентифікатори користувачів були числовими, і я в якийсь момент я зауважив, що вони ніколи не включали в них 8-х або 9-х, таким чином вони знаходились у восьмеричній частині. Мій старий ідентифікатор СНД був 70205.


1
Ваш коментар щодо документації PDP-11 невірний. PDP-11 мав 8 регістрів. R0-R5 були регістрами загального призначення. R6 - покажчик стека, а R7 - ПК. Інструкція MOV взяла два 3-бітні регістрові номери та два режими 3-бітової адреси. Восьмимісний фіксує поля реєстру та режиму PERFECTLY. (Я сильно сумніваюся, що це була випадковість.) Використання hex все б збентежило. PUSH та POP були лише адресовані режимам, які використовували R6. Безпосереднім операндом був режим адресації, який використовував R7.
Джон Р. Стром

@ JohnR.Strohm Дякую за коментар щодо 3-бітових регістрів. Я згоден з вашим аналізом і оновив свою відповідь.
tcrosley

Тож DEC працював в OCT. Щойно ви використовували кратні 3,32 біта, щоб уникнути плутанини.
user234461

Це смішно, як я ніколи не вважав дозволи Unix октальним числом, я завжди вважав це трьома окремими цифрами, записаними разом, кожна з яких представляє три біти rwx, тому вони можуть бути восьмикутними, десятковими або навіть шістнадцятковими.
axl

11

Heathkit використовував їх для передньої панелі свого H-8 та для списку мов мовлення програмного забезпечення на передній панелі (так званого PAM-8). Знайомства з собою, я знаю.

введіть тут опис зображення

У наш час восьмерики дуже рідкісні; всі, здається, використовують hex. Але цифри як і раніше виглядають як цифри у восьмериці, і вам не потрібен додатковий рядок клавіш для цифр від A до F.


2
+1 для Н-8. Незважаючи на те, що зовні він був восьмеричним, процесор був 8080A, що було всього в байтах. Ідіть фіггер.
Blrfl

Я б здогадувався, що вони використовували восьмерику для спільності з Н-11 (який мав процесор PDP-11).
Джері Коффін

2
У 8080 було 8-бітових байт, але набір інструкцій мав більше сенсу, якщо дивитись у восьмигранні, ніж у шістнадцятковій.
RBerteig

6

Однією з причин використання восьмеричного бачення є те, що це найбільша база потужністю 2, для якої вам не потрібні спеціальні символи - тобто всі цифри можуть бути числовими. База 16 (наступна вгору від бази 8) вимагає нечислових цифр (зазвичай A, B, C, D, E, F).


Я знаю, що це давнє, але чому використовувати лише числові цифри краще, ніж також використовувати літери?
Петруза

5

Я використовую восьмиденку щодня. Кожен раз, коли мені потрібно chmod файл, я використовую восьмерику (я попередньо дату позначення u + r ...). Кожен раз, коли мені хочеться вставити контрольний символ всередині рядка, я використовую восьмеричний ... (Так, я міг би використовувати шістнадцятковий, але восьметочний - це те, що я використовую).


2
+1 для "але ось
восьмі

5

Усі, кому потрібно виразити комбінації бітів, згрупованих у трійці.

Чому хтось використовує hex?


Речі в моїй голові, які виражаються у вигляді восьмеричних чисел:

  • Коди, забиті транспондерами Mode 3A в літаках
  • Певні значення, знайдені на шині ARINC 429 авіоніки
  • SCSI адреси
  • Основні коди в ncursesбібліотеці

11
Різниця полягає в тому, що шістнадцятковий "природний" як півбайта. Дві шістнадцяткові цифри = 1 байт. Але ви не можете розділити байти на восьмеричні цифри.
Мейсон Уілер

2
У першому рядку зазначено очевидне. Друга - це погана аналогія.
back2dos

3
І hex абсолютно неприродний для всього, що потрібно виражати групами з трьох біт, як вищезгаданий режим файлів Unix. Не існує закону, який би сказав, що цифри певної системи нумерації повинні відповідати байтам. Якби це було, висловлення чого-небудь на комп’ютері як базі 10 було б гіршою практикою, ніж база 8, яка принаймні вирівнює себе за групами бітів.
Blrfl

6
типовий шістнадцятковий рядок, очевидно, є шістнадцятковим рядком восьмеричний не є.
Пол Натан

1
@Blrfl: Тож скільки з цих згаданих "[речей, які] потрібно виразити групами по три біти", є крім канонічного прикладу? Це власне питання, на яке ви поки що не відповіли. Натомість ви робите ще одну погану аналогію. Існує фактичне використання для десяткового представлення, тому що ми просто навчилися з цим поводитися. На який ви будете обчислювати швидше? 7 * 6або 07 * 06? Ми використовуємо десятковий знак для представлення чисел, оскільки ми можемо їх найкраще обробити, а шістнадцятковий, щоб представити числа дуже близькі до того, як машина їх зберігає. І ми робимо це багато. Цей сайт переповнений доказами цього.
back2dos

5

Ще коли я працював над мейнфреймами CDC (з 60-бітним словом, 12-бітним словом для ППУ), усі основні демпфери та інше робилося в восьмеричному (20 восьмеричних цифр за слово, 4 за слово PPU).


3

Як і шістнадцятковий, для позначення кодів символів іноді використовують восьмеричні позначення. Це може бути зручно з тієї ж причини, що і шістнадцяткова: це компактніше, ніж двійкове, але дуже легко перекласти на бінарне в голові.


2

Як і Hex, восьмеричні числа легко перетворити з двійкових. Просто згрупуйте двійкові цифри у групи по три, починаючи справа.

10010101110  // binary

// conversion
(010)(010)(101)(110)
// so, in octal we have...
(2)(2)(5)(6)
2256

10010101110 (base 2) == 2256 (base 8)

7
Це очевидно. Питання полягає в тому, коли це фактично використовується .
back2dos

2
@ back2dos: тоді сміливо публікуйте відповідь, а не залишайте один і той же коментар кілька разів.
Ред С.

4
@Ed S. Ви навіть не намагалися відповісти на запитання. Ви сказали щось очевидне, на що оригінальний плакат майже напевно вже знав відповідь. Як люблять говорити модератори, ми не знімаємо це. Див. Meta.programmers.stackexchange.com/questions/1968/… для отримання додаткової інформації.
btilly

@ back2dos, btilly - відповіді на сайтах Stackexhange не лише для ОП, вони стають постійним ресурсом для будь-якого читача, що проходить. Усі очевидні факти не обов'язково очевидні для всіх, якщо ця відповідь допомагає краплі для когось, хто має цінність.
ocodo

2
@Slomojo, хоча за цим аргументом, кожне запитання може стати вікі для кожного аспекту теми. Справа в тому, що це не відповідає на питання . Ця відповідь, безумовно, може бути достовірною десь ще, на тему: "Як швидко подумки перетворитись на восьмигранник?"
Ніколь

2

Ні. Ніколи їх не використовував. Навіть не для встановлення дозволів на файли, тому що я роблю це так рідко, мені важко читати.

Так, так, очевидна користь переходу від і до двійкового.
Однак, як уже вказував @Mason, шістнадцятковий - набагато "природніший", оскільки дві шістнадцяткові цифри складають один байт. Корисно представляти 24/32 бітні кольори RGB / ARGB, IP-адреси, байтові маски тощо. Octal з іншого боку не дуже практичний, тому що у вас рідко є сценарії, коли ви працюєте з точки зору 3-бітних груп.

Фактично дозволи на файли - це єдине, про що я міг подумати. І якщо зараз немає сфери використання, я сумніваюся, що вона коли-небудь буде. Оскільки за останні 20 років простір став таким дешевим, стало дуже рідко збирати інформацію так щільно, ціною вирівнювання, простоти використання та розширення.


2

Трохи вбік, але публічне використання є в Лондонському метро. Кожен потяг має як фізичну особу, так і окрему особу в розкладах, які відображаються під час роботи - дивіться тут: https://upload.wikimedia.org/wikipedia/commons/4/49/LUL-S-Stock-at -Watford.jpg (зверніть увагу на 402 у верхній частині пункту призначення). Незважаючи на те, що електроніка для дисплеїв базується на стандартній десятковій основі, ви ніколи не бачите цифр 8 або 9, оскільки вони прив’язані до застарілого обладнання на основі восьмери в сигнальній системі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.