Где восьмеричные полезны? [закрыто]

36

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

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

Вопрос в том, использует ли кто-нибудь восьмеричные символы для чего-либо кроме прав доступа к файлам? (Я лично предпочитаю, chmod ugo+rwxно я понимаю, что если они должны быть сгенерированы программно, полезно использовать восьмеричные числа.) Но полезны ли они в любой другой ситуации?

Petruza
источник
16
Вариант А: Винить себя. Вариант Б: обвинять мир. Вариант C: посмеяться, как вы узнали что-то.
Работа
12
@Petrozza - IMO, использование начального нуля в стиле C для обозначения восьмеричного числа никогда не было хорошим выбором, но это история - вероятно, немного наследия C, хотя оно может быть даже старше. Я думаю, у Ады есть одно из лучших соглашений - восьмеричное число будет записано как 8 # 1234567 #, шестнадцатеричное число 16 # abcdef # и т. Д., А ведущие нули - это просто ведущие нули - любая база от 2 до 16 (по крайней мере) действительна и все визуально очевидно и легко понять.
Steve314
2
@Petruza Ваш вопрос в его первоначальной форме не был конструктивным для этого сайта, и он был улучшен сообществом, чтобы он мог оставаться открытым: см. FAQ для получения дополнительной информации о том, почему люди делают это и почему мы поощряем это. Если у вас есть какие-либо дополнительные вопросы или проблемы, пожалуйста, поднимите их на нашем сайте мета-обсуждения , а не в вашем вопросе.
11
Вариант D: «обвинять PHP» - всегда правильный выбор, независимо от проблемы
Cephalopod
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
Darien
3
Это действительно интересно о Юки и Памане. Мне только что пришло в голову, что шестнадцатеричный подсчет пальцев достаточно прост, если вы используете внутреннюю часть каждого пальца, используя некоторые вариации, как это
ocodo
@Slomojo - на самом деле вы можете сосчитать до 99 на пальцах ...
ловко
3
+1 за очень полный ответ. Грейс Хоппер однажды сказала, что у нее проблемы с балансировкой чековой книжки, потому что она стала настолько опытной в добавлении восьмеричного числа.
Макнейл
14
@ детально, если я знаю, что мне нужно считать большие числа, я буду использовать свои 10 цифр как биты и считать до 1024 только своими пальцами (просто будьте осторожны, с кем вы показываете # 4, # 128 и # 132).
zzzzBov
17

Около 50 лет назад Octal широко использовался 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, таких как Register, Mode и Src / Dest, которые можно декодировать как восьмеричные цифры. (Спасибо Джону Строму за указание на это.)

Интересно, что когда Motorola выпустила свой микропроцессор 68000, который находился под сильным влиянием PDP-11 и имел те же 3-битные поля Mode и Register в инструкциях, они решили использовать только шестнадцатеричный код в своей документации.

Поскольку в PDP-11 использовалась восьмеричная нотация, исходные коды разрешений для Unix, впервые появившиеся на PDP-11, также использовали восьмеричные. Это наследие сохраняется в Linux, где команда chmod все еще использует восьмеричное значение для указания каждого из трехбитовых полей 'rwx'.

Еще одна мелочь - CompuServe, который в 1980-х и начале 1990-х годов широко использовался в качестве коммутируемого онлайн-сервиса (до того, как AOL затмевал его), работал на мини-компьютерах DEC, по крайней мере, изначально. Все идентификаторы пользователей были числовыми, и в какой-то момент я заметил, что в них никогда не было 8 или 9, поэтому они были в восьмеричном виде. Мой старый код СНГ был 70205.

tcrosley
источник
1
Ваш комментарий о документации PDP-11 неверен. У PDP-11 было 8 регистров. R0-R5 были регистрами общего назначения. R6 был указателем стека, а R7 был ПК. Инструкция MOV заняла два 3-битных номера регистра и два 3-битных режима адресации. Восьмичный захватывает регистр и поля режима ОТЛИЧНО. (Я сильно сомневаюсь, что это был несчастный случай.) Использование hex могло бы запутать все. PUSH и POP были просто режимами адресации, которые использовали R6. Непосредственным операндом был режим адресации, который использовал R7.
Джон Р. Штром
@ JohnR.Strohm Спасибо за комментарий по поводу 3-битных регистров. Я согласен с вашим анализом и обновил мой ответ.
tcrosley
Так DEC работал в ОКТ. Нужно было просто использовать кратные 3,32 бит, чтобы избежать путаницы.
user234461
Забавно, что я никогда не рассматривал разрешения Unix как восьмеричное число, я всегда думал о нем как о трех отдельных цифрах, записанных вместе, каждая из которых представляет три rwx-бита, поэтому они могут быть восьмеричными, десятичными или даже шестнадцатеричными.
Axl
11

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

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

В настоящее время восьмеричные очень редки; все, кажется, используют гекс. Но числа по-прежнему выглядят как восьмеричные числа, и вам не нужен дополнительный ряд клавиш для цифр от A до F.

Роберт Харви
источник
2
+1 за H-8. Несмотря на то, что он был восьмеричным на внешней стороне, процессор был 8080A, который был все байты. Иди фиггер.
Blrfl
Я предполагаю, что они использовали восьмеричное для общности с H-11 (у которого был процессор PDP-11).
Джерри Гроб
2
У 8080 были 8-битные байты, но набор инструкций имел больше смысла, если смотреть в восьмеричном, чем в шестнадцатеричном виде.
RBerteig
6

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

tylerl
источник
Я знаю, что это старый, но почему использование только числовых цифр предпочтительнее, чем использование букв?
Петруза
5

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

Majenko
источник
2
+1 за «но восьмеричное это то, что я использую» :)
JoelFan
5

Любой, кому нужно выразить комбинации битов, сгруппированных в тройки.

Почему кто-то использует гекс?


Вещи с макушки головы, которые выражены в виде восьмеричных чисел:

  • Коды, подавленные транспондерами режима 3А в самолетах
  • Определенные значения найдены в шине авионики ARINC 429
  • Адреса SCSI
  • Коды ключей в ncursesбиблиотеке
Blrfl
источник
11
Разница в том, что шестнадцатеричный код является «естественным» в виде половины байта. Две шестнадцатеричные цифры = 1 байт. Но вы не можете разделить байты на восьмеричные цифры.
Мейсон Уилер
2
Первая строка утверждает очевидное. Второй делает плохую аналогию.
back2dos
3
И hex совершенно неестественно для всего, что должно быть выражено в группах по три бита, как в вышеупомянутых режимах файлов Unix. Нет закона, согласно которому цифры конкретной системы нумерации должны совпадать с байтами. Если бы это было так, выражение чего-либо на компьютере в качестве базы 10 было бы хуже практики, чем база 8, которая, по крайней мере, выравнивается по группам битов.
Blrfl
6
типичная шестнадцатеричная строка, очевидно, является шестнадцатеричной строкой. восьмеричное нет.
Пол Натан
1
@Blrfl: Итак, сколько из упомянутых «[вещей, которые] нужно выразить в группах по три бита», кроме канонического примера? Это актуальный вопрос, который вы оставили без ответа до сих пор. Вместо этого вы проводите еще одну плохую аналогию. Существует фактическое использование для десятичного представления, потому что мы просто научились обращаться с ним. Какой из них вы посчитаете быстрее? 7 * 6или 07 * 06? Мы используем десятичную для представления чисел, поскольку мы можем лучше всего с ними обращаться и шестнадцатеричные для представления чисел, очень близких к тому, как машина хранит их. И мы делаем это много. Этот сайт полон доказательств этого.
back2dos
5

Когда я работал над мэйнфреймами CDC (с 60-битным словом, 12-битным словом для PPU), все дампы ядра и тому подобное выполнялись в восьмеричном виде (20 восьмеричных цифр на слово, 4 на слово PPU).

Джерри Гроб
источник
3

Как и шестнадцатеричное, восьмеричное обозначение иногда используется для указания кодов символов. Это может быть удобно по той же причине, что и шестнадцатеричный код: он более компактен, чем двоичный, но его очень легко перевести в двоичный файл в вашей голове.

Калеб
источник
2

Как и шестнадцатеричные, восьмеричные числа легко преобразовать из двоичного кода. Просто сгруппируйте двоичные цифры в группы по три, начиная справа.

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
@ Эд С. Вы даже не пытались ответить на вопрос. Вы сказали что-то очевидное, что первоначальный плакат почти наверняка уже знал ответ. Как любят говорить модераторы, мы не за что стреляем. См. Meta.programmers.stackexchange.com/questions/1968/… для получения дополнительной информации.
btilly
@ back2dos, btilly - ответы на сайтах Stackexhange предназначены не только для OP, они становятся постоянным ресурсом для любого проходящего читателя. Все очевидные факты, не обязательно для всех очевидно, если этот ответ помогает пенни капли для кого - то это имеет значение.
Окодо
2
@Slomojo, хотя по этому аргументу каждый вопрос имеет право стать вики для каждого связанного аспекта темы. Дело в том, что это не отвечает на вопрос . Этот ответ, безусловно, может быть действительным в другом месте: «Как быстро мысленно преобразовать в восьмеричное?»
Николь
2

Нет. Никогда не использовал их. Даже для настройки прав доступа к файлам, потому что я делаю это так редко, что мне трудно читать.

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

Права доступа к файлам - единственное, о чем я мог думать. И если сейчас нет области применения, я сомневаюсь, что она когда-нибудь будет. С тех пор, как последние 20 лет пространство стало настолько дешевым, стало очень редко собирать информацию так плотно, за счет выравнивания, простоты использования и расширяемости.

back2dos
источник
2

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

Джулия Хейворд
источник