Я никогда не использовал восьмеричные числа в своем коде и не встречал кода, который его использовал (несмотря на шестнадцатеричное и битовое вращение).
Я начал программировать на C / C++ примерно в 1994 году, так что, может быть, я слишком молод для этого? В старом коде используется восьмеричное число? C включает поддержку для них, добавляя 0, но где находится код, который использует эти числовые литералы с основанием 8?
@pmg: Интересно, возникнут ли какие-либо трудности с определением 0q1234 как «правильного» формата для ненулевых восьмеричных констант и явным опровержением 01234 с рекомендацией, чтобы компиляторы производили нефатальную диагностику? На самом деле, я бы хотел видеть общий битовый формат 0 [[x [0-9A-Fa-f] +] | [q [0-7] +] | [w [0-3] +] | [v [0-1] +]] +, чтобы разрешить смешивание 1-4-битных полей, поскольку 3-битные поля не всегда выравниваются с точностью до 3-х битов справа.
По некоторому совпадению этот вопрос оказался сегодня на первой странице SO (кто-то добавил ответ), и Рэймонд Чен тоже сегодня опубликовал статью о восьмеричном беспорядке: Проклятие ведущего нуля
Единственное использование, которое я видел, - это определение флагов и разрешений open () файла, поскольку они обычно копируются из ссылок на стандарты. Но даже в этих случаях они не намного полезнее, чем десятичное или даже двоичное представление целочисленных литералов.
@supercat Python 3 делает это - восьмеричные константы имеют форму 0o1234, тогда как старая форма 01234 дает синтаксическую ошибку.
а это: esdiscuss.org/topic/…





Это полезно для функций 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/…
Верно, но они обычно используются только для существующих протоколов, которые используют 3-битные группы или их кратные. Любой новый код и протоколы обычно используют ниблы или их кратные числа, обычно обозначаемые в шестнадцатеричном формате.
@mirabilos - довольно широкое утверждение. Нет причин блокировать длину полей, кратную 4 или 8 битам - фактически, исключение других длин может привести к большим накладным расходам в протоколе. Возможно, для некоторых приложений это не имеет значения, но как насчет протоколов, поддерживающих приложение, для которого действительно важна производительность? В этих случаях вы бы не выбрали 4-битное поле, когда подойдет 3-битное поле.
@BenCollins «обычно» не означает «всегда любой ценой». Я предполагаю разумное мышление на стороне разработчика протокола. Тем не менее, современные вещи (за последние несколько десятилетий…) имеют тенденцию использовать шестнадцатеричный, а не восьмеричный.
Единственное место, где я сталкиваюсь в наши дни с восьмеричными литералами, - это биты прав доступа к файлам в Linux, которые обычно представлены в виде трех восьмеричных цифр, где каждая цифра представляет разрешения для владельца файла, группы и других пользователей соответственно.
например 0755 (также только 755 с большинством инструментов командной строки) означает, что владелец файла имеет полные разрешения (чтение, запись, выполнение), а группа и другие пользователи имеют только разрешения на чтение и выполнение.
Представление этих битов в восьмеричном формате упрощает определение установленных разрешений. Вы можете сразу сказать, что означает 0755, но не 493 или 0x1ed.
Также ресурсы IPC, такие как семафоры и разделяемая память. uw714doc.sco.com/en/SDK_sysprog/_Getting_Semaphores.html#ipc _i8
Связался с Octal через PDP-11, и так, видимо, язык Си сделал :)
Ах, PDP11; Я все еще помню большую часть кодировки: 010446 = MOV R4, - (SP) с 01xxxx = mov; 04 = R4; 46 = - (SP).
Я также видел восьмеричные числа, используемые в транспондерах самолетов. Код транспондера режима 3a - это 12-битное число, с которым все работают как 4 восьмеричные числа. По Википедия есть немного больше информации. Я знаю, что это вообще не связано с компьютером, но FAA тоже использует компьютеры :).
Я думаю, что это было сделано в интересах авионики десятилетней давности, где вы помещаете код на четыре колесика, которые напрямую кодируют 12-битное значение в простую цифровую логику для последовательной передачи. Микропроцессор не использовался, так как его у них не было (или они не хотели сложности в приложении авионики).
Коммерческая авиация использует восьмеричные «метки» (в основном идентификаторы типов сообщений) в почтенном стандарте шины Arinc 429. Так что возможность указывать значения меток в восьмеричном формате при написании кода для приложений авионики - это хорошо ...
Есть еще несколько старых систем управления процессами (Honeywell H4400, H45000 и т. д.) Конца 60-х и 70-х годов, которые предназначены для использования 24-битных слов с восьмеричной адресацией. В качестве одного из примеров подумайте, когда в Соединенных Штатах были построены последние атомные электростанции.
Замена этих промышленных систем - довольно серьезное мероприятие, поэтому вам может просто повезти встретить одну в дикой природе, прежде чем они вымрут и не трепетно смотрят на свои великолепные пользовательские форматы с плавающей запятой!
Хороший граватар ... Ты меня туда привел.
файлы tar хранят информацию в виде строки восьмеричного целого числа
Это целое число (не десятичное и не восьмеричное) или нить?
@vonbrand - это восьмеричные строки.
I have never used octal numbers in my code nor come across any code that used it.
Бьюсь об заклад, у тебя есть. Согласно стандарту числовые литералы, начинающиеся с нуля, являются восьмеричными. Сюда входит, тривиально, 0. Каждый раз, когда вы использовали или видели буквальный ноль, это было восьмеричное число. Удивительно, но факт. :-)
На самом деле это не так. Восьмеричное число начинается с «0» в качестве обозначения. Точно так же, как «0x» не является допустимым числом, «0» не является восьмеричным числом. «00» - это.
Думаю, вы ошибаетесь. Раздел 6.4.4.1 ISO / IEC 9899: 201x определяет форму, которую могут принимать буквальные константы, а 0 явно указан как восьмеричная константа. Кроме того, десятичные константы не могут начинаться с нуля. Вы можете увидеть черновик этого стандарта онлайн здесь.
@LucBloom 0 фактически является восьмеричный. См. 0 - десятичный или восьмеричный литерал?
Мы могли бы сказать, что буквальный 0 является только восьмеричным согласно лексическому определению, но серьезно число 0 выражается во всех возможных основаниях одновременно. Или, может быть, ничего из этого.
@Petruza все числа находятся только в определенной базе в их заданном лексическом представлении. После того, как он был проанализирован, у него вообще не будет базы.
За исключением 0, который имеет одно и то же представление независимо от основания.
Любой, кто научился программировать на PDP-8, питает теплое сердце к восьмеричным числам. Размер слова составлял 12 бит, разделенных на 4 группы по 3 бита в каждой, поэтому -1 было 7777 восьмеричным числом. Эта схема была сохранена в PDP-11, который имел 16-битные слова, но все еще использовал восьмеричное представление для различных вещей, отсюда и схема разрешений файлов * NIX, которая существует и по сей день.
Восьмеричный формат был и был наиболее полезным с первым доступным дисплейным оборудованием (7-сегментные дисплеи). Эти оригинальные дисплеи не имели декодеров, доступных позже.
Таким образом, выходы цифровых регистров были сгруппированы, чтобы соответствовать имеющемуся дисплею, который мог отображать только восемь (8) символов: 0,1,2 3,4,5,6,7.
Также первые ЭЛТ-трубки были дисплеями с растровой разверткой, а простейшие генераторы символов были эквивалентны 7-сегментным дисплеям.
Мотивирующим драйвером, как всегда, был самый дешевый из возможных дисплеев.
Чтобы уточнить: конечно, вы можете отображать шестнадцатеричные цифры на 7-сегментном дисплее; Вы говорите, что проблема заключалась в том, чтобы снизить сложность кодировщиков для них? Действительно ли добавление цифр обходится дешевле, чем добавление логики?
Нет никакой земной причины изменять стандарт, восходящий к рождению языка и существующий в бесчисленном количестве программ. Я до сих пор помню символы ASCII по их восьмеричные значения, пришлось бы подумать, чтобы придумать шестнадцатеричное значение A, но оно равно 101 в восьмеричной системе; числовой 0 - 060 ... ^ C - 003 ...
То есть я часто использую восьмеричное представление.
Теперь, если вы действительно хотите согнуть свою мину, взгляните на формат слова для PDP-10 ...
Я использую их (в виде восьмеричных нулей) все время:
if (b < 0) b = 0;