8進数から10進数へ:モードやマスク、古いダンプを読む
この変換でわかること
基数8で書かれた値を読み、基数10で書き直します。モードがすでに8進数で書かれているとき、つまりchmodやlsが期待する形式のときに必要になる向きです。得られた数値をスクリプトや設定ファイル、周囲のコードが10進数を前提にしている比較へ渡す場面で使います。
位の重みは8の累乗
右端から順に、重みは1、8、64、512…となります。755なら7 × 64 + 5 × 8 + 5で493です。ただし10進数にした時点で、桁はもはや3つの独立した権限ではありません。8進数表記の読みやすさを支えていた構造は、10進数への変換そのものによって失われる点に注意してください。
8進数と10進数の変換表
権限モードやマスクと、その10進数の値です。スクリプトで扱うには10進数が便利ですが、読むには8進数のままのほうがよく、多くの現場では両方を記録しています。
| 8進数 | 10進数 |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 7 | 7 |
| 10 | 8 |
| 17 | 15 |
| 100 | 64 |
| 377 | 255 |
| 644 | 420 |
| 755 | 493 |
| 1000 | 512 |
8進数の用途が権限に絞られた理由
基数は機械のまとまり方と一致したときに居場所を得ます。8進数は6ビットや12ビットのワードに合っていましたが、8ビットのバイトが当たり前になると自然な区切りは4ビット、つまり16進数になりました。権限は本当に9ビット幅で3つの組に均等に分かれるため、基数の都合とデータの構造がいまも一致しています。
権限の計算を10進数でやらない
10進数の493に64を足して読み取り権限を与えるのは正しくありません。その64は10進数の64で、8進数のモードに立てたいビットとは別物です。権限の計算は400や40のような8進数の値で行い、保存や表示のためにだけ変換してください。
よくある質問
8進数から10進数へ手計算で変換するには?
各桁に位の値(右から1、8、64、512…)を掛けて足し合わせます。755なら7 × 64 + 5 × 8 + 5、つまり448 + 40 + 5で493になります。
スクリプトで chmod 755 が493と表示されるのはなぜですか?
スクリプトがモードをただの10進整数として読んでいるからです。ファイルシステムが保持しているビットはどちらでも同じで、違うのは表記だけです。8進数の形はコメントや頭の中に残し、10進数を前提とするコードと接する境界でだけ変換してください。
先頭の0には意味がありますか?
数値としては意味がありません。0755と755は同じ値です。ただし「これは8進数だ」と示す目印としては有用で、8進数のリテラルに先頭の0を要求する言語もあります。本ツールは入力の先頭0や0oの接頭辞を受け付け、出力には付けません。
8進数の小数も変換できますか?
変換できます。分母が2の累乗かどうかで割り切れるかが決まるため、8進数でも小数が割り切れる場合とそうでない場合があります。割り切れないときは結果を切り捨て、正確な答えであるかのように丸めず、その旨をはっきり示します。
扱える8進数の桁数に上限はありますか?
実際のモードやマスクよりはるかに長い値まで扱えます。整数のまま計算するため、長い入力でも浮動小数点の電卓のように丸められた結果ではなく、全桁が正しい値が返ります。