これは何?
特に言語を限定するような話もせずに「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 アセンブラ が発祥なのかもしれない(が、明確には書いていない)。
お願い
この言語はこうだよ、みたいな情報をコメントに書いていただけると、私が喜びます。