Литералы восьмеричных чисел: когда? Почему? Всегда?

Я никогда не использовал восьмеричные числа в своем коде и не встречал кода, который его использовал (несмотря на шестнадцатеричное и битовое вращение).

Я начал программировать на C / C++ примерно в 1994 году, так что, может быть, я слишком молод для этого? В старом коде используется восьмеричное число? C включает поддержку для них, добавляя 0, но где находится код, который использует эти числовые литералы с основанием 8?

Я использую их (в виде восьмеричных нулей) все время: if (b < 0) b = 0;

pmg 16.10.2009 21:00

@pmg: Интересно, возникнут ли какие-либо трудности с определением 0q1234 как «правильного» формата для ненулевых восьмеричных констант и явным опровержением 01234 с рекомендацией, чтобы компиляторы производили нефатальную диагностику? На самом деле, я бы хотел видеть общий битовый формат 0 [[x [0-9A-Fa-f] +] | [q [0-7] +] | [w [0-3] +] | [v [0-1] +]] +, чтобы разрешить смешивание 1-4-битных полей, поскольку 3-битные поля не всегда выравниваются с точностью до 3-х битов справа.

supercat 01.08.2011 19:40

По некоторому совпадению этот вопрос оказался сегодня на первой странице SO (кто-то добавил ответ), и Рэймонд Чен тоже сегодня опубликовал статью о восьмеричном беспорядке: Проклятие ведущего нуля

Michael Burr 17.01.2014 05:24

Единственное использование, которое я видел, - это определение флагов и разрешений open () файла, поскольку они обычно копируются из ссылок на стандарты. Но даже в этих случаях они не намного полезнее, чем десятичное или даже двоичное представление целочисленных литералов.

eckes 18.02.2015 08:26

@supercat Python 3 делает это - восьмеричные константы имеют форму 0o1234, тогда как старая форма 01234 дает синтаксическую ошибку.

glglgl 03.12.2015 16:41

а это: esdiscuss.org/topic/…

Jerry Jeremiah 16.08.2016 00:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
49
6
33 037
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Это полезно для функций chmod и mkdir в мире Unix, но кроме этого, я не могу придумать других распространенных применений.

От Википедия

At the time when octal originally became widely used in computing, systems such as the IBM mainframes employed 24-bit (or 36-bit) words. Octal was an ideal abbreviation of binary for these machines because eight (or twelve) digits could concisely display an entire machine word (each octal digit covering three binary digits). It also cut costs by allowing Nixie tubes, seven-segment displays, and calculators to be used for the operator consoles; where binary displays were too complex to use, decimal displays needed complex hardware to convert radixes, and hexadecimal displays needed to display letters.

All modern computing platforms, however, use 16-, 32-, or 64-bit words, with eight bits making up a byte. On such systems three octal digits would be required, with the most significant octal digit inelegantly representing only two binary digits (and in a series the same octal digit would represent one binary digit from the next byte). Hence hexadecimal is more commonly used in programming languages today, since a hexadecimal digit covers four binary digits and all modern computing platforms have machine words that are evenly divisible by four. Some platforms with a power-of-two word size still have instruction subwords that are more easily understood if displayed in octal; this includes the PDP-11. The modern-day ubiquitous x86 architecture belongs to this category as well, but octal is almost never used on this platform.

-Адам

Ответ принят как подходящий

Недавно мне пришлось написать код сетевого протокола, который обращается к 3-битным полям. Octal пригодится, когда вы захотите это отладить.

Просто для эффекта, можете ли вы сказать мне, что это за 3-битные поля?

0x492492

С другой стороны, это же число в восьмеричном формате:

022222222

Теперь, наконец, в двоичном формате (группами по 3 штуки):

010 010 010 010 010 010 010 010

Я упомянул ваш ответ в аналогичном вопросе на Programmers Exchange и расширил его, что, возможно, заинтересует других, кому интересны восьмеричные числа: programmers.stackexchange.com/questions/98692/…

Abel 18.01.2014 02:28

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

mirabilos 31.05.2014 23:02

@mirabilos - довольно широкое утверждение. Нет причин блокировать длину полей, кратную 4 или 8 битам - фактически, исключение других длин может привести к большим накладным расходам в протоколе. Возможно, для некоторых приложений это не имеет значения, но как насчет протоколов, поддерживающих приложение, для которого действительно важна производительность? В этих случаях вы бы не выбрали 4-битное поле, когда подойдет 3-битное поле.

Ben Collins 07.08.2014 19:11

@BenCollins «обычно» не означает «всегда любой ценой». Я предполагаю разумное мышление на стороне разработчика протокола. Тем не менее, современные вещи (за последние несколько десятилетий…) имеют тенденцию использовать шестнадцатеричный, а не восьмеричный.

mirabilos 08.08.2014 17:29

Единственное место, где я сталкиваюсь в наши дни с восьмеричными литералами, - это биты прав доступа к файлам в Linux, которые обычно представлены в виде трех восьмеричных цифр, где каждая цифра представляет разрешения для владельца файла, группы и других пользователей соответственно.

например 0755 (также только 755 с большинством инструментов командной строки) означает, что владелец файла имеет полные разрешения (чтение, запись, выполнение), а группа и другие пользователи имеют только разрешения на чтение и выполнение.

Представление этих битов в восьмеричном формате упрощает определение установленных разрешений. Вы можете сразу сказать, что означает 0755, но не 493 или 0x1ed.

Также ресурсы IPC, такие как семафоры и разделяемая память. uw714doc.sco.com/en/SDK_sysprog/_Getting_Semaphores.html#ipc‌ _i8

An̲̳̳drew 26.11.2008 18:09

Связался с Octal через PDP-11, и так, видимо, язык Си сделал :)

Ах, PDP11; Я все еще помню большую часть кодировки: 010446 = MOV R4, - (SP) с 01xxxx = mov; 04 = R4; 46 = - (SP).

greggo 07.12.2010 22:28

Я также видел восьмеричные числа, используемые в транспондерах самолетов. Код транспондера режима 3a - это 12-битное число, с которым все работают как 4 восьмеричные числа. По Википедия есть немного больше информации. Я знаю, что это вообще не связано с компьютером, но FAA тоже использует компьютеры :).

Я думаю, что это было сделано в интересах авионики десятилетней давности, где вы помещаете код на четыре колесика, которые напрямую кодируют 12-битное значение в простую цифровую логику для последовательной передачи. Микропроцессор не использовался, так как его у них не было (или они не хотели сложности в приложении авионики).

greggo 07.12.2010 22:26

Коммерческая авиация использует восьмеричные «метки» (в основном идентификаторы типов сообщений) в почтенном стандарте шины Arinc 429. Так что возможность указывать значения меток в восьмеричном формате при написании кода для приложений авионики - это хорошо ...

Есть еще несколько старых систем управления процессами (Honeywell H4400, H45000 и т. д.) Конца 60-х и 70-х годов, которые предназначены для использования 24-битных слов с восьмеричной адресацией. В качестве одного из примеров подумайте, когда в Соединенных Штатах были построены последние атомные электростанции.

Замена этих промышленных систем - довольно серьезное мероприятие, поэтому вам может просто повезти встретить одну в дикой природе, прежде чем они вымрут и не трепетно ​​смотрят на свои великолепные пользовательские форматы с плавающей запятой!

Хороший граватар ... Ты меня туда привел.

Jared Updike 17.10.2009 02:24

файлы tar хранят информацию в виде строки восьмеричного целого числа

Это целое число (не десятичное и не восьмеричное) или нить?

vonbrand 02.02.2013 01:48

@vonbrand - это восьмеричные строки.

Alnitak 20.10.2020 18:16

I have never used octal numbers in my code nor come across any code that used it.

Бьюсь об заклад, у тебя есть. Согласно стандарту числовые литералы, начинающиеся с нуля, являются восьмеричными. Сюда входит, тривиально, 0. Каждый раз, когда вы использовали или видели буквальный ноль, это было восьмеричное число. Удивительно, но факт. :-)

На самом деле это не так. Восьмеричное число начинается с «0» в качестве обозначения. Точно так же, как «0x» не является допустимым числом, «0» не является восьмеричным числом. «00» - это.

Luc Bloom 29.11.2016 15:36

Думаю, вы ошибаетесь. Раздел 6.4.4.1 ISO / IEC 9899: 201x определяет форму, которую могут принимать буквальные константы, а 0 явно указан как восьмеричная константа. Кроме того, десятичные константы не могут начинаться с нуля. Вы можете увидеть черновик этого стандарта онлайн здесь.

Tim 30.11.2016 01:48

@LucBloom 0 фактически является восьмеричный. См. 0 - десятичный или восьмеричный литерал?

underscore_d 02.08.2017 12:35

Мы могли бы сказать, что буквальный 0 является только восьмеричным согласно лексическому определению, но серьезно число 0 выражается во всех возможных основаниях одновременно. Или, может быть, ничего из этого.

Petruza 02.04.2019 15:59

@Petruza все числа находятся только в определенной базе в их заданном лексическом представлении. После того, как он был проанализирован, у него вообще не будет базы.

Alnitak 20.10.2020 18:07

За исключением 0, который имеет одно и то же представление независимо от основания.

Petruza 20.10.2020 22:37

Любой, кто научился программировать на PDP-8, питает теплое сердце к восьмеричным числам. Размер слова составлял 12 бит, разделенных на 4 группы по 3 бита в каждой, поэтому -1 было 7777 восьмеричным числом. Эта схема была сохранена в PDP-11, который имел 16-битные слова, но все еще использовал восьмеричное представление для различных вещей, отсюда и схема разрешений файлов * NIX, которая существует и по сей день.

Восьмеричный формат был и был наиболее полезным с первым доступным дисплейным оборудованием (7-сегментные дисплеи). Эти оригинальные дисплеи не имели декодеров, доступных позже.

Таким образом, выходы цифровых регистров были сгруппированы, чтобы соответствовать имеющемуся дисплею, который мог отображать только восемь (8) символов: 0,1,2 3,4,5,6,7.

Также первые ЭЛТ-трубки были дисплеями с растровой разверткой, а простейшие генераторы символов были эквивалентны 7-сегментным дисплеям.

Мотивирующим драйвером, как всегда, был самый дешевый из возможных дисплеев.

Чтобы уточнить: конечно, вы можете отображать шестнадцатеричные цифры на 7-сегментном дисплее; Вы говорите, что проблема заключалась в том, чтобы снизить сложность кодировщиков для них? Действительно ли добавление цифр обходится дешевле, чем добавление логики?

rakslice 10.11.2013 03:13

Нет никакой земной причины изменять стандарт, восходящий к рождению языка и существующий в бесчисленном количестве программ. Я до сих пор помню символы ASCII по их восьмеричные значения, пришлось бы подумать, чтобы придумать шестнадцатеричное значение A, но оно равно 101 в восьмеричной системе; числовой 0 - 060 ... ^ C - 003 ...

То есть я часто использую восьмеричное представление.

Теперь, если вы действительно хотите согнуть свою мину, взгляните на формат слова для PDP-10 ...

Другие вопросы по теме