16進数変換
16進数・10進数・2進数をリアルタイム相互変換
上で変換元・変換先の基数を選び、値を入力すると自動で変換されます。
処理中…
0.0
停止していません。計算が終わると結果が表示されます。
16進数変換について
16進数・10進数・2進数のどれかを入力すると、残りの二つに変換して表示します。内部ではJavaScriptのBigIntを使っているため桁数の上限がなく、64ビットのハッシュ値や128ビットのUUIDを一つの数として入れても下位桁が丸められることはありません。
初期設定(ビット幅「制限なし」)では符号なし整数として扱うので、FFは255です。ところがデバッガやメモリダンプでFFを見かけると、-1を意味していることがよくあります。ビット幅を8・16・32・64から選び「符号付き (2の補数)」をオンにすると、FFを-1として読み、10進数欄に-5のような負の数も入力できます。以下では、同じビット列がなぜ255にも-1にもなるのかを説明します。小数点はどのモードでも受け付けません。
0xFFが-1になる理由:2の補数
メモリには符号が別に記録されているわけではありません。8ビットの領域に11111111が入っているだけで、符号なし(uint8)として読めば255、符号付き(int8)として読めば-1です。現在のほぼすべてのCPUは符号付き整数を2の補数で表します。nビットで最上位ビットが1なら、符号なしの値から2^nを引いたものが実際の値、というのが規則です。
8ビットなら0xFF = 255 - 256 = -1、0x80 = 128 - 256 = -128、0x7F = 127です。int8の範囲が-128〜127と負の側が一つ長いのはこのためです。逆に-5を8ビットの16進数で書きたいときは、ビット幅8・符号付きをオンにして10進数-5を入れればFB(2進数11111011)が得られます(符号なしモードで256 - 5 = 251を入れても同じです)。
2の補数が選ばれたのは、加算回路一つで減算もこなせるからです。11111111(-1)に00000001を足すと1_00000000になり、8ビットからあふれた桁は捨てられて0が残ります。符号ビット方式や1の補数では+0と-0の二つが生じますが、2の補数ではゼロは一つだけです。
ビット幅が分からないと符号は読めない
FFが-1かどうかは、その値が何ビットの領域に入っていたかで決まります。16ビットの0x00FFはただの255で、16ビットの-1は0xFFFFです。32ビットなら0xFFFFFFFF、64ビットならFが16個並びます。
ビット幅が「制限なし」のときは先頭の0を省いて出力するので、0x00FFを入れるとFFと表示されます。ビット幅を選ぶと出力がその幅まで0で埋められ(16ビットならFF → 00FF)、幅に収まらない値は範囲外と表示されます。
- 8ビット:00〜FF、符号付きで-128〜127
- 16ビット:0000〜FFFF、符号付きで-32,768〜32,767
- 32ビット:符号付き最大値 0x7FFFFFFF = 2,147,483,647
- 64ビット:符号付き最大値 0x7FFFFFFFFFFFFFFF = 9,223,372,036,854,775,807
16進数が好まれる理由と読み違え
16 = 2^4なので、16進数1桁がちょうど2進数4桁(ニブル)に対応します。1バイトは常に16進数2桁で、2進数を4桁ずつ区切れば頭の中で変換できます。カラーコード#RRGGBB、MACアドレス、メモリアドレス、UTF-8のバイト列が16進数で書かれるのはこのためです。0x・0bの接頭辞と空白はそのまま入力できます。
他のツールから値を写すときはバイト順に注意してください。x86やARMのメモリダンプでは32ビット値0x12345678が78 56 34 12の順に並びます(リトルエンディアン)。その順のまま貼ると別の数になるので、先にバイトを逆に並べ替えます。
例
ダンプ中のFBを符号付き8ビットとして読む
- 入力
16進数 FB- 結果
10進数 251、2進数 11111011
最上位ビットが1なので、int8では251 - 256 = -5です。
32ビット符号付き整数の最大値
- 入力
10進数 2147483647- 結果
16進数 7FFFFFFF
1を足した80000000はint32では-2,147,483,648になります。オーバーフローで負に回り込む様子です。
空白区切りのバイト列
- 入力
16進数 DE AD BE EF- 結果
10進数 3735928559
空白は無視されます。int32として読むと3735928559 - 4294967296 = -559038737です。
使い方
- 手元の値の進数(16・10・2)の欄を選びます。
- 値を入力します。0x・0bや空白は付いたままで構いません。符号付き整数として読むには、ビット幅を選んで「符号付き」をオンにします。
- 他の二つの表記を確認してコピーします。
よくある質問
負の数は入力できますか?
ビット幅(8・16・32・64)を選び「符号付き (2の補数)」をオンにすると、10進数欄に負の数を入れられます。16ビットで-1ならFFFF、8ビットで-129のように収まらない値は範囲外と表示されます。64ビットもBigIntで正確に計算します。
非常に大きな数でも正確ですか?
BigIntで計算するため桁数に関係なく正確です。
0.5のような小数は変換できますか?
できません。浮動小数点数のビット列はIEEE 754形式で、単純な進数変換とは別物です。
出典
基準日: