16進数変換

16進数・10進数・2進数をリアルタイム相互変換

上で変換元・変換先の基数を選び、値を入力すると自動で変換されます。

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です。

使い方

  1. 手元の値の進数(16・10・2)の欄を選びます。
  2. 値を入力します。0x・0bや空白は付いたままで構いません。符号付き整数として読むには、ビット幅を選んで「符号付き」をオンにします。
  3. 他の二つの表記を確認してコピーします。

よくある質問

負の数は入力できますか?

ビット幅(8・16・32・64)を選び「符号付き (2の補数)」をオンにすると、10進数欄に負の数を入れられます。16ビットで-1ならFFFF、8ビットで-129のように収まらない値は範囲外と表示されます。64ビットもBigIntで正確に計算します。

非常に大きな数でも正確ですか?

BigIntで計算するため桁数に関係なく正確です。

0.5のような小数は変換できますか?

できません。浮動小数点数のビット列はIEEE 754形式で、単純な進数変換とは別物です。

出典

基準日:

プライバシーとデータの扱い