スプレッドシートで10進数を8進数に直そうとして、DEC2OCT関数で手が止まったことはありませんか。
-100を変換したら7777777634という10桁の数字が出てきた072のように頭の0を残したいのに、桁がそろわない- 変換結果に
+9したら、8進数としては合わない値になった
どれも関数の仕様どおりの動きです。ただ、理由を知らないまま台帳に貼ると、間違った値が静かに残ってしまいます。
この記事の動作と値は、Googleスプレッドシートの実機で確かめたものです(計算で求めた例は、その旨を添えています)。書き方・桁数指定・負数の読み方・エラーの直し方を順に整理しました。chmod管理表での使いどころや、BASE関数との使い分けもあわせて見ていきましょう。
スプレッドシートのDEC2OCT関数の書き方と引数(結果はテキスト)
DEC2OCT(デック・ツー・オクト)は、10進数を8進数に変換するエンジニアリング関数です。名前は Decimal(10進)to Octal(8進)の略。最初に押さえたいのは、結果が数値ではなくテキストで返る点です。
構文と範囲
=DEC2OCT(10進数, [桁数])
| 引数 | 必須 | 内容 |
|---|---|---|
| 10進数 | 必須 | 変換したい10進数。-536,870,912〜536,870,911 |
| 桁数 | 省略可 | 結果の桁数(1〜10)。足りない分を左から0で埋める |
公式ヘルプでは2つ目の引数を「有効桁」と呼んでいます。この記事では、意味が伝わりやすい「桁数」と書きますね。
範囲の外を渡すと #NUM! が返ります。公式ヘルプは負の下限を「-53687092」と書いていますが、桁が1つ落ちた誤記でしょう。実機では -536870912 まで変換でき、-536870913 で #NUM! になりました。
基本例(8→10 / 255→377 / 493→755)
=DEC2OCT(8) → 10
=DEC2OCT(255) → 377
=DEC2OCT(493) → 755
=DEC2OCT("199") → 307
8は8進数だと桁が1つ上がるので「10」。255は 3×64+7×8+7 なので「377」になります。"199" のように数字の文字列を渡しても、数値の199と同じ307が返ります。
結果がテキストであることは、=ISTEXT(DEC2OCT(8)) が TRUE になる点からもわかります。この性質が、後で出てくる計算の罠につながるので覚えておきましょう。
ARRAYFORMULAで一括変換(1例)
列ごとまとめて変換するなら、ARRAYFORMULAとの組み合わせが手軽。DEC2OCTは空白セルを「0」に変換してしまうため、空行はIFで外しておくのが安全です。
=ARRAYFORMULA(IF(A2:A20="", "", DEC2OCT(A2:A20)))
桁数を指定してゼロ埋めする(DEC2OCT(58,3)=072)
3桁固定の例
58を8進数にすると「72」。2つ目の引数に3を入れると、左に0を足して「072」になります。結果がテキストなので、先頭の0が消える心配もありません。
=DEC2OCT(58, 3) → 072
=DEC2OCT(8, 3) → 010
=DEC2OCT(8, 10) → 0000000010
桁数の上限は10です。chmodのような3桁表記や、固定長のコードをそろえたいときに役立ちます。
桁数が足りないと #NUM!
桁数は「この桁数に切り詰める」指定ではありません。結果より短い桁数を入れると、#NUM! が返ります。255は「377」の3桁なので、=DEC2OCT(255, 2) はエラーになるわけです。
桁数0・小数の挙動(実測値)
桁数に入れる値ごとに、結果をまとめました。
| 式 | 結果 | ポイント |
|---|---|---|
=DEC2OCT(255, 4.9) | 0377 | 小数は切り捨てて4桁 |
=DEC2OCT(255, 0) | #NUM! | 0は不可 |
=DEC2OCT(255, -1) | #NUM! | 負の値は不可 |
=DEC2OCT(255, 11) | #NUM! | 11以上は不可 |
=DEC2OCT(255, "a") | #VALUE! | 文字列は不可 |
迷ったら「1〜10の整数」と覚えておけば十分。結果の桁数より小さくしないことだけ気をつけてください。
負の数は10桁になる(7777777634の読み方)
-1 / -100 / -536870912 の結果
負の数を渡すと、結果は必ず10桁の8進数になります。
=DEC2OCT(-1) → 7777777777
=DEC2OCT(-100) → 7777777634
=DEC2OCT(-536870912) → 4000000000
これは「2の補数」という表し方。コンピューターが負の数を表すときの決まりごとです。10桁の8進数は30ビット分にあたります。負の数は、2^30(1,073,741,824)から絶対値を引いた値で表されます。
-100なら、1,073,741,724 を8進数にした値が「7777777634」というわけです。
先頭4〜7なら負数・桁数指定は無視される
読み分けのコツは、先頭の1桁を見ること。正の最大 536870911 は「3777777777」で、先頭は3です。負の数は「4000000000」以上の並びになるので、10桁で先頭が4〜7なら負数と判断できます。
負の数では、1〜10の桁数を指定しても無視されます。=DEC2OCT(-1, 3) も「7777777777」の10桁のまま。ただし桁数が0・負の値・11のときは、負数でも #NUM! になる点に注意してください。
OCT2DECで戻して検算
10桁の値が本当に元の数なのか、気になりますよね。そんなときは逆変換のOCT2DEC関数に渡しましょう。
=OCT2DEC(DEC2OCT(-100)) → -100
=OCT2DEC(DEC2OCT(493)) → 493
負の数も、手計算なしで元の値に戻ります。台帳に貼る前の往復チェックとして使うと安心です。
エラー早見表(症状→原因→直し方)
困ったときは、症状から当たりをつけるのが近道。エラーにならない「見た目だけ正常」なケースも一緒に並べました。
| 症状 | 原因 | 直し方 |
|---|---|---|
| #NUM! | 10進数が範囲外 | 大きい正の数はBASE関数を使う |
| #NUM! | 桁数が結果より短い | 桁数を増やすか省略する |
| #NUM! | 桁数が0・負・11以上 | 1〜10の整数にする |
| #VALUE! | “abc” など数字でない文字列 | 数値か数字の文字列にする |
| 空白なのに「0」 | 空白セル・”” は0扱い | IFで空白を除外する |
| 「1」が出る | TRUE は1として扱われる | 参照先の列を見直す |
| 11桁の「10000000000」 | -0.5 など負の小数 | 先にTRUNC・INTで整数にする |
#NUM!(範囲外・桁数不足)
#NUM!の原因は「数が範囲の外」か「桁数の指定」のどちらかです。まず桁数を外して =DEC2OCT(A2) で試すと、切り分けが早くなります。それでもエラーなら、数そのものが範囲外と判断できます。
#VALUE!(文字列)と、エラーにならない入力
=DEC2OCT("abc") のように、数字として読めない文字列は #VALUE! です。前後に空白がある " 8 " は、そのまま「10」に変換されました。
厄介なのは、エラーにならない入力のほう。空白セルや "" は「0」、TRUE は「1」が返ります。見た目は正常なので、空行の多い表ではIFで除外しておきましょう。
小数は0の方向へ切り捨てられます(7.9→7、-7.9→-7 の「7777777771」)。ただし -0.5 は「10000000000」という11桁の値になり、-1とも0とも一致しません。小数が混じる列は、先にTRUNCかINTで整数にしてから渡すのが確実です。
結果が+で黙って数値計算される罠
WARNING
DEC2OCTの結果に
+で数を足すと、8進数ではなく10進数として計算されます。=DEC2OCT(8)+9は「10」を10進の10と読み、19を返します。8進数として正しい答えではありません。一方、=SUM(DEC2OCT(8), DEC2OCT(10))はテキストを無視するので0です。
計算は10進数のうちに済ませて、最後にDEC2OCTで変換するのが正解。8進数の値どうしを足したいときは、OCT2DECで10進に戻してから計算します。
次の2例は、計算で求めた結果です(8+9=17 は8進で21、8+10=18 は8進で22)。
=DEC2OCT(8 + 9) → 21
=DEC2OCT(OCT2DEC("10") + OCT2DEC("12")) → 22
IFERRORで隠さない
=IFERROR(DEC2OCT(A2, 3), "") のように丸ごと包むと、範囲外も桁数不足も同じ空欄になります。原因が見えなくなるので、除外したい条件だけをIFで絞るのがおすすめです。
=IF(A2="", "", DEC2OCT(A2, 3))
実務例:スプレッドシートのchmod管理表をDEC2OCTで作る
rwxの合算値から3桁のchmod値へ
chmodの数字は、所有者・グループ・その他の3桁でできています。各桁は読み取り r=4、書き込み w=2、実行 x=1 を足した0〜7の値。たとえば rwx は 4+2+1=7、r-x は 4+1=5 です。
各桁をB〜D列に入れておけば、桁の重み(64・8・1)を掛けて合計し、DEC2OCTで3桁にできます。
| A:ファイル | B:所有者 | C:グループ | D:その他 | E:chmod値 |
|---|---|---|---|---|
| deploy.sh | 7 | 5 | 5 | 755 |
| config.ini | 6 | 4 | 4 | 644 |
=DEC2OCT(B2*64 + C2*8 + D2, 3)
7×64+5×8+5 は493で、結果は「755」。6×64+4×8+4 なら「644」になります。特殊ビットを含む4桁の表記を扱うときは、桁数を4にしてください。
755は最初から8進という整理
混同しやすいのが「755」と「493」の関係です。chmod 755 の「755」は最初から8進数の表記なので、表にそのまま書くなら変換は要りません。
DEC2OCTの出番は、モード値を10進数の整数で持っているとき。プログラムやツールが493のような10進数で返した値を、chmod表記に直す場面です。逆に755から493を求めるなら、=OCT2DEC("755") か =DECIMAL("755", 8) を使います。
なお、chmodに493をそのまま渡しても755にはなりません。chmodは数字を8進数として読むからです。
他の基数変換との使い分けとFAQ
DEC2BIN / DEC2HEX / BASE / DECIMAL / OCT2DEC 比較表
| 関数 | 変換の向き | 扱える範囲・特徴 |
|---|---|---|
| DEC2OCT | 10進→8進 | -536,870,912〜536,870,911 |
| DEC2BIN | 10進→2進 | -512〜511 |
| DEC2HEX | 10進→16進 | -549,755,813,888〜549,755,813,887 |
| BASE | 10進→2〜36進 | 0以上。上限を超えても変換できるが負数は#NUM! |
| DECIMAL | 2〜36進→10進 | DECIMAL("755", 8) は493 |
| OCT2DEC | 8進→10進 | 10桁の負数表記も戻せる |
判断軸はシンプルで、負の数を扱うならDEC2OCT、536,870,911を超える正の数ならBASEです。=BASE(536870912, 8) なら、DEC2OCTだと#NUM!になる数でも「4000000000」です。一方 =BASE(-1, 8) は#NUM!なので、負数には使えません。
8進数から2進・16進へはOCT2BIN・OCT2HEX、逆向きはBIN2OCT・HEX2OCTが担当です。
FAQ
Q. 負の数を10桁ではなく「-144」のように表示できますか?
DEC2OCT単体ではできません。絶対値を変換して符号を付ける形なら、次の式で表せます。
=IF(A2<0, "-" & DEC2OCT(-A2), DEC2OCT(A2))
A2が-100なら、100の8進数「144」に符号を付けて「-144」です(計算で求めた例)。DEC2OCT本来の10桁表記とは別物なので、見せるための表示用と割り切りましょう。なお -536870912 は絶対値が範囲外になり、この式でも #NUM! です。
Q. Excelでも同じ関数は使えますか?
Excelにも同名のDEC2OCT関数があります。Excelでの使い方は、ExcelのDEC2OCT関数の解説にまとめました。
