Из десятичной в восьмеричную: система, спрятанная за правами доступа
Что делает эта конвертация
Инструмент записывает число из основания 10 в основании 8, используя цифры от 0 до 7. Восьмеричная давно ушла в немногие ниши, но одна из этих ниш очень оживлённая: права доступа в Unix, где маска вроде 755 или 644 записана в восьмеричной и читается как три независимые цифры, а не как одно число.
Три бита на цифру — в этом весь смысл
Одна восьмеричная цифра покрывает ровно три двоичных разряда, поэтому девятибитное поле прав аккуратно делится на три группы: владелец, группа и остальные. Отсюда и живучесть нотации для прав, хотя для арифметики её перестали применять очень давно. Каждая группа складывается из 4 за чтение, 2 за запись и 1 за выполнение, так что 7 означает все три права, а 5 — чтение и выполнение.
Таблица перевода из десятичной системы в восьмеричную
Десятичные значения, стоящие за режимами файлов и небольшими масками, которые встречаются чаще всего. Строки с правами стоит выучить наизусть: chmod принимает восьмеричную форму, а отчёты показывают десятичную.
| Десятичная | Восьмеричная |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 7 | 7 |
| 8 | 10 |
| 10 | 12 |
| 15 | 17 |
| 16 | 20 |
| 31 | 37 |
| 64 | 100 |
| 100 | 144 |
| 127 | 177 |
| 200 | 310 |
| 255 | 377 |
| 1000 | 1750 |
Откуда взялась восьмеричная и где она уцелела
Восьмеричная хорошо ложилась на машины с разрядностью, кратной трём битам, и ранние мини-компьютеры вроде PDP-8 были устроены именно так. Когда стандартом стали восьмибитные байты и шестнадцатибитные слова, её место заняла шестнадцатеричная: четыре делит восемь, а три — нет. Главными выжившими оказались права на файлы, сохранённые десятилетиями привычки и тем, что три бита прав идеально делятся на три.
Как читать цифру прав
Воспринимайте каждую восьмеричную цифру режима как небольшую сумму: 4 — чтение, 2 — запись, 1 — выполнение, сложенные вместе. Тогда 755 — это чтение, запись и выполнение для владельца, а затем чтение с выполнением для группы и остальных, а 644 — чтение и запись для владельца и только чтение для всех прочих.
Частые вопросы
Как перевести десятичное число в восьмеричное вручную?
Делите на 8 и записывайте остаток, затем повторяйте с частным, пока оно не станет нулём, и читайте остатки от последнего к первому. Для 493: 493 ÷ 8 — это 61 и остаток 5, 61 ÷ 8 — это 7 и остаток 5, 7 ÷ 8 — это 0 и остаток 7, получается 755.
Почему права на файлы записывают в восьмеричной?
Потому что три бита прав на каждый класс пользователей ровно укладываются в одну восьмеричную цифру, и весь режим читается как три короткие цифры вместо девяти битов. 755 означает чтение, запись и выполнение, затем чтение с выполнением, затем снова чтение с выполнением — формат, который расшифровывается без всякой арифметики.
Что на самом деле даёт chmod 755?
Владелец может читать, писать и выполнять файл; участники группы и все остальные могут читать и выполнять, но не изменять. В десятичном виде это 493. Для каталогов те же три бита означают другое: выполнение там нужно, чтобы вообще можно было войти в каталог.
Восьмеричная ещё где-нибудь используется?
Иногда. Некоторые языки позволяют записывать восьмеричные литералы с ведущим нулём, ещё пара форматов файлов и сетевых масок их применяет. За пределами этих случаев её вытеснила шестнадцатеричная, потому что байт чисто делится на две шестнадцатеричные цифры, а на три не делится восемь.
А отрицательные значения и дроби принимаются?
Да, и то и другое. Отрицательное число сохраняет минус перед восьмеричными цифрами — это знаково-величинная форма, а не дополнительный код. Дроби переводятся разряд за разрядом, и если разложение не заканчивается, результат помечается как усечённый, а не округляется молча.