調べて分かる道具箱

n進数の変換

2〜36進数を相互に変換します。負の数と2の補数にも対応しています。

変換結果
進数
2進数コンピュータの内部表現1111 1111
8進数ファイルの権限(chmod)377
10進数255
16進数色コード・メモリアドレスff
36進数0-9 と a-z を使い切る上限73

2の補数で見る

「0xFF は 255 なのか −1 なのか」は、何ビットの符号つきとして読むかで変わります。

ビット幅
8ビットとして読んだ場合
符号なしunsigned 8bit255
符号つきsigned 8bit・2の補数範囲外
同じビットの並び16進 / 2進0xff
1111 1111

よくある質問

0xFF は 255 ですか、それとも −1 ですか?

どちらもありえます。符号なし8ビットとして読めば255、符号つき8ビット(2の補数)として読めば−1です。同じビットの並びをどう解釈するかの違いなので、扱っている型がどちらかを確認する必要があります。

2の補数とは何ですか?

負の数をビットで表す方法です。ある数の全ビットを反転して1を足すと、その数の負の値になります。この方式だと引き算を足し算の回路で処理でき、0の表現が1通りに定まるという利点があります。

16進数はなぜ使われるのですか?

1桁がちょうど4ビットに対応するからです。8ビットが2桁、32ビットが8桁ときれいに収まり、2進数の長い並びを短く書けます。色コード #FF8800 も、赤・緑・青を各1バイトずつ表しています。

8進数はどこで使いますか?

ファイルの権限を表す chmod 755 のような場面です。読み・書き・実行の3つのビットが1桁にちょうど収まるため、3桁で所有者・グループ・その他の権限を表せます。

36進数まで対応しているのはなぜですか?

0〜9の10文字とa〜zの26文字を合わせて36文字が、英数字だけで表せる上限だからです。短いURLやIDの生成で使われます。

2の補数はなぜあの形なのか

負の数をビットで表す方法は、2の補数のほかにもあります。先頭1ビットを符号に使う 「符号つき絶対値」や、全ビットを反転する「1の補数」です。どちらも直感的ですが、 0が2通り(+0と−0)できてしまい、足し算の回路が複雑になります。

2の補数では、負の数を「2のビット幅乗から引いた値」として表します。 8ビットなら −1 は 256 − 1 = 255、つまり 0xFF です。この方式の利点は、 引き算を「負の数の足し算」としてそのまま処理できる点にあります。 1 + (−1) を計算すると 0x01 + 0xFF = 0x100 になり、8ビットからあふれた桁を捨てると 0x00 になります。特別な処理を入れずに正しい答えが出ます。

0も1通りしかありません。0x00 だけが0で、−0 に相当するビット列は存在しません。 この2点のために、現在のほぼすべてのコンピュータが2の補数を採用しています。

範囲外の値を切り捨てない理由

8ビットの符号つきで表せるのは −128 から 127 までです。ここに128を入れると、 多くのプログラミング言語ではあふれた桁が捨てられて −128 になります。 この計算機では、そうならずに「範囲外です」と表示します。

黙って切り捨てた値を出すと、入力を間違えたことに気づけないまま 別の数を答えとして受け取ってしまうためです。あふれ自体を調べたい場合は、 ビット幅を大きくするか、符号なしの表として読んでください。