10進数から8進数へ:ファイル権限の裏に隠れた基数
この変換でわかること
10進数の数を基数8で、つまり0から7の数字だけで書き直します。8進数は使われる場面が大きく減りましたが、その数少ない用途のひとつが非常に身近です。Unixのファイル権限で、755や644といったマスクは8進数であり、1つの数ではなく3つの独立した桁として読まれます。
8進数1桁はちょうど3ビット
8進数の1桁は2進数のちょうど3桁に対応するため、9ビットの権限フィールドは所有者・グループ・その他という3つの組にきれいに分かれます。読み・書き・実行にそれぞれ4・2・1を割り当てるので、7は3つすべて、5は読みと実行を意味します。
10進数と8進数の対応表
よく使うファイルモードや小さなマスクの裏にある10進数の値です。権限の行は目で覚えておくと役立ちます。chmodは8進数で受け取り、レポートは10進数で返すことが多いからです。
| 10進数 | 8進数 |
|---|---|
| 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 |
8進数の来歴と生き残った場所
8進数はワード長が3の倍数だった頃の機械によく合い、PDP-8のような初期のミニコンはその作りでした。8ビットのバイトと16ビットのワードが標準になると、8は4で割り切れて3では割り切れないため16進数に取って代わられます。権限が生き残ったのは、9ビットという幅が3ずつにきれいに分かれるからです。
権限の桁を読み解く
モードの8進数1桁は小さな足し算として読みます。4が読み、2が書き、1が実行で、見えている数字はその合計です。755なら所有者が読み書き実行、グループとその他が読みと実行、644なら所有者が読み書きで、他は読みのみになります。
よくある質問
10進数から8進数へ手計算で変換するには?
8で割って余りを書き、商が0になるまで繰り返してから、余りを最後から順に読みます。493なら493 ÷ 8 = 61 余り 5、61 ÷ 8 = 7 余り 5、7 ÷ 8 = 0 余り 7となり、答えは755です。
ファイル権限が8進数で書かれるのはなぜですか?
利用者の区分ごとに3つの権限ビットがあり、それが8進数の1桁にちょうど収まるからです。モード全体が9ビットではなく3桁の短い数字として読めるので、755は読み書き実行、読み実行、読み実行と、計算なしで解読できます。
chmod 755 は具体的に何を許可しますか?
所有者は読み・書き・実行、グループのメンバーとその他の利用者は読みと実行ができ、書き換えはできません。10進数に直すと493です。ディレクトリでは実行ビットの意味が変わり、中に入るために必要になるため、通常は設定されます。
8進数はほかにも使われていますか?
限定的ですが使われます。先頭に0を付けて8進数のリテラルを書ける言語があり、一部のファイル形式やネットワークマスクでも見かけます。それ以外の場面では16進数に置き換わりました。1バイトが2桁の16進数にきれいに分かれる一方、3では8を割り切れないからです。
負の数や小数も変換できますか?
どちらも変換できます。負の数は8進数の桁の前にマイナス記号が付き、2の補数ではなく符号と絶対値の表記になります。小数は1桁ずつ展開し、割り切れない場合は、丸めたことに触れずに済ませず、切り捨てたことを明示します。