16進数から10進数へ:表示された値に意味を与える
この変換でわかること
基数16で書かれた値を読み、基数10で書き直します。16進数は機械やビット列の比較には便利ですが、しきい値の判断やバイト数、人間が一目で見比べる場面では10進数のほうが向いています。ツールが値を出したまま説明を止めたとき、最初に使うのがこの向きです。
位の重みは16の累乗になる
右端から順に、各桁は1、16、256、4096…を掛けた値を持ちます。1E90FFなら1 × 16の5乗から始まり、14 × 16の4乗、以下が続いて2003199になります。使う重みが変わるだけで、どの基数でも計算の形は同じ足し算です。
16進数と10進数の変換表
デバッグやWebの作業で日常的に出会う16進数の値と、その10進数表記です。きりのよい16進数はバイトやページの境界を示すので、覚えておく価値があります。
| 16進数 | 10進数 |
|---|---|
| 0 | 0 |
| 1 | 1 |
| F | 15 |
| 10 | 16 |
| 7F | 127 |
| A5 | 165 |
| FF | 255 |
| 1000 | 4096 |
| FFFF | 65535 |
| DEADBEEF | 3735928559 |
実際に何を読み解くのか
よくあるのは、色のチャンネルを読む、アドレスを境界と比べる、切り詰めたハッシュを比較可能な数値にする、という3つの場面です。色が最もわかりやすく、0x1E90FFは30、144、255に分かれ、青が最大で赤が弱いと読み取れます。この3段階の読み方は、どんな詰め込み値にも当てはまります。
変換する前に分割する
6桁の色コードや長いアドレスは、2桁ずつの組に分けるとぐっと読みやすくなります。1組がちょうど1バイトだからです。全体をまとめて変換しても答えは出ますが、どのバイトが異常なのかが見えるのは分割したときだけです。
よくある質問
16進数から10進数へ手計算で変換するには?
各桁に位の値(右から1、16、256、4096…)を掛けて足し合わせます。Aは10、Bは11、Fは15である点に注意してください。1E90FFなら1048576 + 917504 + 36864 + 0 + 240 + 15で2003199になります。
メモリアドレスが長い16進数に見えるのはなぜですか?
アドレスはバイトやワードの境界に沿って並んでおり、16進数の桁はその境界とそろうからです。16進数の2桁が1バイトなので、先頭側の桁はページを、末尾側の桁はそのページ内の位置を表します。
0xの付いた値をそのまま貼り付けられますか?
はい。接頭辞は認識されて取り除かれてから変換されるため、デバッガやソースファイルからそのままコピーした値も編集なしで使えます。このページで扱わない基数の接頭辞は、黙って無視せずエラーとして知らせます。
ハッシュの先頭を数値に変換する意味はありますか?
計算としてはできますが、実用上の意味は限られます。パターンを見つけたり比較をスクリプト化したりする用途では役立ちますが、切り詰めた時点でハッシュとしての性質は失われているため、10進数にした値を識別子として扱わないでください。
一度に変換できる桁数はどれくらいですか?
実用上は十分な長さで、64ビット(16桁)はもちろんそれを超える値も扱えます。上限付近の値は浮動小数点では正確に表せないため、整数のまま計算して全桁を正しく返します。長すぎる入力は切り捨てずに拒否します。