スプレッドシートのDEC2OCT関数の使い方|負数の10桁表記と桁数指定

スポンサーリンク

スプレッドシートで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.sh755755
config.ini644644
=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 比較表

関数変換の向き扱える範囲・特徴
DEC2OCT10進→8進-536,870,912〜536,870,911
DEC2BIN10進→2進-512〜511
DEC2HEX10進→16進-549,755,813,888〜549,755,813,887
BASE10進→2〜36進0以上。上限を超えても変換できるが負数は#NUM!
DECIMAL2〜36進→10進DECIMAL("755", 8) は493
OCT2DEC8進→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関数の解説にまとめました。

タイトルとURLをコピーしました