web-dev-qa-db-ja.com

16進数の先頭に0xが付いているのはなぜですか?

16進数の先頭に0xが付いているのはなぜですか?接頭辞の使い方は理解できますが、なぜ0xが選択されたのかの意味はわかりません。

371
unj2

簡単な話:0は、(識別子や予約語ではなく)定数を扱っていることをパーサに伝えます。基数を指定するためには、まだ何かが必要です。xは任意の選択です。

長い話:60年代に普及したプログラミング数体系は10進数で、8進数 - メインフレームは12でした1バイトあたり24ビットまたは36ビットであり、これは3 = log 2(8)で割り切れる。

BCPL言語は、8進数の構文8 1234を使用しました。 Ken ThompsonがBCPLからBを作成したとき、彼は代わりに0プレフィックスを使用しました。これは素晴らしいです

  1. 整数定数は常に単一のトークンで構成されます。
  2. パーサーはまだ定数があるとすぐに言うことができます、
  3. パーサーはすぐに基底を伝えることができます(0は両方の基底で同じです)。
  4. それは数学的に正気です(00005 == 05)、そして
  5. 貴重な特殊文字は必要ありません(#123のように)。

CがBから作成されたとき、16進数の必要性が生じ(PDP-11は16ビットワードを持っていました)、そして上記のすべての点はまだ有効でした。他のマシンにはまだ8進数が必要だったので、0xが任意に選択されました(00はおそらく扱いにくいと除外されました)。

C#はCの子孫なので、構文を継承します。

393
Řrřola

注:私は正しい答えを知りませんが、以下は私の個人的な憶測です!

数字の前に0が記述されているように、それは8進数であることを意味します。

04524 // octal, leading 0

16進数を表すためのシステムを考え出す必要があると想像してください、そして我々はCスタイルの環境で働いていることに注意してください。アセンブリのようにhで終わるのはどうですか。残念ながら、できません - それはあなたが有効な識別子であるトークンを作ることを可能にするでしょう(例えば、あなたは変数に同じことを命名することができます)。

8000h // hex
FF00h // oops - valid identifier!  Hex or a variable or type named FF00h?

同じ理由でキャラクターとつながることはできません。

xFF00 // also valid identifier

ハッシュを使用することは、プリプロセッサと衝突するのでおそらく投げ出されました:

#define ...
#FF00 // invalid preprocessor token?

結局、どういうわけか、彼らは16進数を表すために先行する0の後にxを置くことにしました。それはまだ数字で始まっていて有効な識別子にはなり得ないのでそれは明白です、そしておそらく先行する0の8進法に基づいています。

0xFF00 // definitely not an identifier!
91
AshleysBrain

数字が他の基数ではなく16進数であることを示すための接頭辞です。 Cプログラミング言語はそれを使用してコンパイラに伝えます。

例:

0x6400は、6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.に変換されます。コンパイラが0x6400を読み取ると、0xという用語を使用して、数値が16進数であることがわかります。通常(6400)でわかる16 または(6400)8 または何でも..

バイナリの場合、次のようになります。

0b00000001

私が何らかの形で助けてくれたことを願っています。

こんにちは!

20
loyola

先行する0は、基数2、8、または16の数値を示すために使用されます。

私の意見では、 'x'は16進数のように聞こえるので、0xは16進数を示すために選ばれました。

私の意見ですが、それは理にかなっていると思います。

良い一日!

8
Johnny Low