Восьмеричная система счисления ( основание 8 ) — это система счисления , в основе которой лежит восьмерка .
В десятичной системе каждый знак представляет собой степень десяти . Например:
В восьмеричной системе каждое место соответствует степени восьмерки. Например:
Выполняя приведенные выше вычисления в знакомой десятичной системе, мы видим, почему 112 в восьмеричной системе равно десятичной.
Восьмеричные цифры можно легко преобразовать из двоичных представлений (аналогично четвертичной системе счисления ) путем группировки последовательных двоичных цифр в группы по три (начиная справа, для целых чисел). Например, двоичное представление десятичного числа 74 — это 1001010. Два нуля можно добавить слева: (00)1 001 010 , соответствующие восьмеричным цифрам 1 1 2 , что дает восьмеричное представление 112.
Восемь багуа или триграмм И Цзин соответствуют восьмеричным цифрам:
Готфрид Вильгельм Лейбниц установил связь между триграммами, гексаграммами и двоичными числами в 1703 году. [1]
Восьмеричная система стала широко использоваться в вычислениях, когда такие системы, как UNIVAC 1050 , PDP-8 , ICL 1900 и мэйнфреймы IBM, использовали 6-битные , 12-битные , 24-битные или 36-битные слова. Восьмеричная цифра была идеальным сокращением двоичного кода для этих машин, поскольку размер их слова делится на три (каждая восьмеричная цифра представляет три двоичных цифры). Таким образом, две, четыре, восемь или двенадцать цифр могут кратко отобразить целое машинное слово . Это также сократило расходы, позволив использовать трубки Никси , семисегментные дисплеи и калькуляторы для консолей оператора, где двоичные дисплеи были слишком сложны для использования, десятичные дисплеи требовали сложного оборудования для преобразования систем счисления, а шестнадцатеричные дисплеи требовались для отображения большего количества цифр. .
Однако все современные вычислительные платформы используют 16-, 32- или 64-битные слова, которые далее делятся на восьмибитные байты . В таких системах потребуются три восьмеричные цифры на байт, причем старшая восьмеричная цифра представляет две двоичные цифры (плюс один бит следующего значащего байта, если таковой имеется). Восьмеричное представление 16-битного слова требует 6 цифр, но старшая восьмеричная цифра представляет (довольно неэлегантно) только один бит (0 или 1). Такое представление не дает возможности легко прочитать самый значимый байт, поскольку он размазан по четырем восьмеричным цифрам. Поэтому сегодня в языках программирования чаще используется шестнадцатеричное число, поскольку две шестнадцатеричные цифры точно определяют один байт. На некоторых платформах с размером слова, равным степени двойки, все еще есть подслова инструкций, которые легче понять, если они отображаются в восьмеричном формате; сюда входят семейства PDP-11 и Motorola 68000 . Современная повсеместно распространенная архитектура x86 также относится к этой категории, но восьмеричная система на этой платформе используется редко, хотя некоторые свойства двоичного кодирования опкодов становятся более очевидными при отображении в восьмеричном формате, например байт ModRM, который делится на поля длиной 2, 3 и 3 бита, поэтому восьмеричное число может быть полезно при описании этих кодировок. До появления ассемблеров некоторые программисты вручную кодировали программы в восьмеричном формате; например, Дик Уиппл и Джон Арнольд написали Tiny BASIC Extended непосредственно в машинном коде, используя восьмеричные числа. [11]
Восьмеричное число иногда используется в вычислениях вместо шестнадцатеричного, возможно, чаще всего в наше время в сочетании с правами доступа к файлам в системах Unix (см. chmod ). Преимущество этой системы заключается в том, что она не требует каких-либо дополнительных символов в качестве цифр (шестнадцатеричная система имеет основание 16 и, следовательно, требует шести дополнительных символов помимо 0–9). Он также используется для цифровых дисплеев.
В языках программирования восьмеричные литералы обычно обозначаются различными префиксами , включая цифру 0
, буквы o
или q
, комбинацию цифр и букв 0o
или символ &
[12] или $
. В соглашении Motorola восьмеричные числа начинаются с префикса @
, тогда как маленькая (или заглавная [13] ) буква o
[13] или q
[13] добавляется в качестве постфикса в соответствии с соглашением Intel . [14] [15] В Concurrent DOS , Multiuser DOS и REAL/32, а также в DOS Plus и DR-DOS различные переменные среды, такие как $CLS , $ON , $OFF , $HEADER или $FOOTER , поддерживают \nnn
восьмеричное представление чисел. [16] [17] [18] и DR-DOS DEBUG\
также используют префикс восьмеричных чисел.
Например, литерал 73 (основание 8) может быть представлен как , 073
, o73
, q73
, 0o73
, \73
, @73
или на разных языках.&73
$73
73o
В новых языках префикс отказались от префикса 0
, поскольку десятичные числа часто представляются ведущими нулями. Префикс q
был введен, чтобы избежать ошибочного принятия префикса o
за ноль, а префикс 0o
был введен, чтобы избежать начала числового литерала с буквенного символа (например, o
или q
), поскольку это могло привести к тому, что литерал можно было спутать с именем переменной. Префикс 0o
также соответствует модели, заданной префиксом 0x
, используемым для шестнадцатеричных литералов в языке C ; поддерживается Haskell , [19] OCaml , [20] Python начиная с версии 3.0, [21] Raku , [22] Ruby , [23] Tcl начиная с версии 9, [24] PHP начиная с версии 8.1, [25] ] Rust [26] и ECMAScript начиная с ECMAScript 6 [27] (префикс 0
изначально обозначал базу 8 в JavaScript , но мог вызвать путаницу, [28] поэтому он не рекомендуется в ECMAScript 3 и исключен из ECMAScript 5 [29] ).
Восьмеричные числа, которые используются в некоторых языках программирования (C, Perl , PostScript ...) для текстового/графического представления строк байтов, когда некоторые значения байтов (непредставленные в кодовой странице, неграфические, имеющие специальное значение в текущем контексте или иным образом нежелательно) должно быть экранировано как \nnn
. Восьмеричное представление может быть особенно удобно для байтов, отличных от ASCII, в формате UTF-8 , который кодирует группы из 6 бит и где любой начальный байт имеет восьмеричное значение \3nn
, а любой байт продолжения имеет восьмеричное значение \2nn
.
Восьмеричная система также использовалась для операций с плавающей запятой в компьютерах Ferranti Atlas (1962), Burroughs B5500 (1964), Burroughs B5700 (1971), Burroughs B6700 (1971) и Burroughs B7700 (1972).
Транспондеры в самолетах передают «кричащий» код , выраженный в виде четырех-восьмеричного числа, при опросе наземного радара. Этот код используется для различения разных самолетов на экране радара.
Чтобы преобразовать целые десятичные числа в восьмеричные, разделите исходное число на максимально возможную степень 8 и разделите остатки на последовательно меньшие степени 8, пока степень не станет равна 1. Восьмеричное представление формируется из частных, записанных в порядке, генерируемом алгоритм. Например, чтобы преобразовать 125 10 в восьмеричное:
Следовательно, 125 10 = 175 8 .
Другой пример:
Следовательно, 900 10 = 1604 8 .
Чтобы преобразовать десятичную дробь в восьмеричную, умножьте ее на 8; целая часть результата — это первая цифра восьмеричной дроби. Повторяйте процесс с дробной частью результата, пока он не станет нулевым или не окажется в допустимых пределах погрешности.
Пример. Преобразование 0,1640625 в восьмеричное число:
Следовательно, 0,1640625 10 = 0,124 8 .
Эти два метода можно комбинировать для обработки десятичных чисел как с целыми, так и с дробными частями, используя первый для целой части, а второй для дробной части.
Чтобы преобразовать целые десятичные числа в восьмеричные, добавьте к числу префикс «0.». Выполните следующие действия, пока цифры остаются в правой части системы счисления: Удвойте значение в левой части системы счисления, используя восьмеричные правила, переместите точку системы счисления на одну цифру вправо, а затем поместите удвоенное значение под текущую цифру. значение так, чтобы точки системы счисления совпадали. Если перемещенная точка системы счисления пересекает цифру 8 или 9, преобразуйте ее в 0 или 1 и добавьте перенос к следующей левой цифре текущего значения. Добавьте восьмеричные цифры слева от системы счисления и просто опустите эти цифры вправо без изменений.
Пример:
0,4 9 1 8 десятичное значение +0 --------- 4,9 1 8 +1 0 -------- 6 1,1 8 +1 4 2 -------- 7 5 3,8 +1 7 2 6 -------- 1 1 4 6 6. восьмеричное значение
Чтобы преобразовать число k в десятичное, используйте формулу, определяющую его восьмеричное представление:
В этой формуле a i — преобразуемая отдельная восьмеричная цифра, где i — позиция цифры (считая от 0 для самой правой цифры).
Пример. Преобразование 764 8 в десятичное число:
Для двузначных восьмеричных чисел этот метод заключается в умножении первой цифры на 8 и добавлении второй цифры для получения суммы.
Пример: 65 8 = 6 × 8 + 5 = 53 10
Чтобы преобразовать восьмеричные числа в десятичные, добавьте к числу префикс «0.». Выполните следующие действия до тех пор, пока цифры остаются в правой части системы счисления: Удвойте значение в левой части системы счисления, используя десятичные правила, переместите точку системы счисления на одну цифру вправо, а затем поместите удвоенное значение под текущую цифру. значение так, чтобы точки системы счисления совпадали. Вычтите десятичные цифры слева от системы счисления и просто опустите эти цифры вправо без изменений.
Пример:
0,1 1 4 6 6 восьмеричное значение -0 ----------- 1,1 4 6 6 - 2 ---------- 9,4 6 6 - 1 8 ---------- 7 6,6 6 - 1 5 2 ---------- 6 1 4,6 - 1 2 2 8 ---------- 4 9 1 8. десятичное значение
Чтобы преобразовать восьмеричную цифру в двоичную, замените каждую восьмеричную цифру ее двоичным представлением.
Пример: Преобразовать 51 8 в двоичный формат:
Следовательно, 51 8 = 101 001 2 .
Этот процесс является обратным предыдущему алгоритму. Двоичные цифры группируются по тройкам, начиная с младшего бита и продвигаясь влево и вправо. При необходимости добавьте ведущие нули (или конечные нули справа от десятичной точки), чтобы заполнить последнюю группу из трех. Затем замените каждую тройку эквивалентной восьмеричной цифрой.
Например, преобразуйте двоичное число 1010111100 в восьмеричное:
Следовательно, 1010111100 2 = 1274 8 .
Преобразуйте двоичное число 11100.01001 в восьмеричное:
Следовательно, 11100.01001 2 = 34,22 8 .
Преобразование производится в два этапа с использованием двоичного кода в качестве промежуточной базы. Восьмеричное число преобразуется в двоичное, а затем двоичное в шестнадцатеричное, при этом цифры группируются по четырем, каждая из которых соответствует шестнадцатеричной цифре.
Например, преобразуйте восьмеричное число 1057 в шестнадцатеричное:
Следовательно, 1057 8 = 22F 16 .
Преобразование шестнадцатеричного числа в восьмеричное происходит путем сначала преобразования шестнадцатеричных цифр в 4-битные двоичные значения, а затем перегруппировки двоичных битов в 3-битные восьмеричные цифры.
Например, чтобы преобразовать 3FA5 16 :
Следовательно, 3FA5 16 = 37645 8 .
Из-за того, что у многих восьмеричных дробей есть только двойные дроби, они имеют повторяющиеся цифры, хотя они, как правило, довольно просты:
В таблице ниже даны разложения некоторых распространенных иррациональных чисел в десятичной и восьмеричной форме.
{{cite book}}
: |work=
игнорируется ( помощь ) (Примечание. NWDOSTIP.TXT — это всеобъемлющая работа по Novell DOS 7 и OpenDOS 7.01 , включая описание многих недокументированных функций и внутренних устройств. Это часть еще более обширной MPDOSTIP.ZIP
коллекции автора, поддерживаемой до 2001 года и распространяемой на многих сайтах того времени. Предоставленная ссылка указывает на более старую версию файла, преобразованную в HTML NWDOSTIP.TXT
.)Если входная строка начинается с "0" (ноль), предполагается, что система счисления равна быть 8 (восьмеричное) или 10 (десятичное).
Выбор именно системы счисления зависит от реализации.
ECMAScript 5 поясняет, что следует использовать 10 (десятичное число), но пока не все браузеры поддерживают это.