これは何?
特に言語を限定するような話もせずに「16進数は頭に 0x を付けます」のようなことが書いてある記事(もう見失っている)を見て、いや色々あるよ、と思ったので調べてみた。
調べてみた
0x... チーム
頭に 0x をつける言語たとてもたくさんある。
C, C++, Objective-C, Haskell, OCaml, Perl, Python, PHP, Ruby, Java, JavaScript, C#, Swift, Go, Rust, ...
上記のリストを見る限り、C言語に由来しているように見える。
Cの祖先といえば BCPL ということで BCPL のマニュアルらしきもの を見てみると
deadcode=#xDEADC0DE.
などとあるので、どうも BCPL 由来ではないらしい。
じゃあ B言語かなと思って B 言語のマニュアルらしきもの を見ると、こちらには 16進数リテラルがそもそも存在しない。
C言語 をデザインするときに発明したものなのかなぁ。
0 に続く x は、 hexadecimal の x なんだろうなぁと思う。
あと。
Haskell・OCaml などの、あまり C 言語の影響下に無さそうな人たちも 0x.. 方式を採用しているのに驚いた。
そう思うと C 言語由来じゃないのかもとも思うけど、どうなんだろう。
Pascal と Delphi
Pascal とその末裔は
val := $deadbeef;
のように、頭に $ をつける。
じゃあ 8進数どうすんだって思うわけだけど、
&377 のように別の記号を使う。贅沢だね。
Basic とその末裔
Basic では、頭に &h をつける。この h は hexadecimal の h なんだと思う。
Fortran
書き方が
Z'DEADBEEF'X'DEADBEEF''DEADBEEF'X
のように色々あるらしい。末尾に Z をつける例は見当たらなかった。
最初に書いた Z'DEADBEEF' が主流で、残りは非推奨っぽい。
なんで Z なのかというと。
https://fortran-lang.discourse.group/t/boz-constants-but-why-z/981/4
によると、X が使えなかったから、らしい。
Common Lisp
#16rDEADBEEF
のように、# +基数+r を頭につけるらしい。
r ってなんだろ。
2022.7.4 追記: コメントを頂き ああ radix か、そりゃそうか、と思った。ありがとうございます。
よく使う 16進数 には #x というシンタックスシュガーもあって、
#xDEADBEEF
でもよいらしい。
Smalltalk
16rDEADBEEF
のように書くらしい。Common Lisp と似ているね。
Ada
16#DEADBEEF#
のように、 16#〜# で書くらしい。
PL/I
Enterprise PL/I for z/OS Language Reference - IBM
に
’100’XN /* same as ’00000100’XN with value 256 */
’8000’XN /* same as ’00008000’XN with value 32,768 */
’FFFF’XN /* same as ’0000FFFF’XN with value 65,535 */
とあるので、 'DEADBEEF'XN という形式らしい。
CASLⅡ
#DEAD のように、先頭に # をつける。
じゃあ 8進数どうすんだって思うわけだけど、 8進数は書けないらしい。
調べて思ったこと
0x... 方式は
- 16進数であることを示すために必要な文字が 2文字だけ。
-
$や&などの文字を特定の用途に専有することもない。 - 16進数以外も同じような記法で作れる。
と、わりと優れている感じがする。
これで「0 で始まったら 8進数」というルールさえなければ手放しで絶賛なのだけど。
まとめ
やっぱり色々あるね。
色々あるんだけど、新し目の言語の殆どは 0xdeadbeef 方式を採用しているっぽい。
C 言語発祥なのかなぁ。
それと。Wikipedia に素晴らしい記事があることを 教えていただいた。
完全にこの記事より優れている。
この記事を見ると、 AT&T アセンブラ が発祥なのかもしれない(が、明確には書いていない)。
お願い
この言語はこうだよ、みたいな情報をコメントに書いていただけると、私が喜びます。