niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(R) Rで 0xFFL と 書いてみる(11/18追記)

言語仕様?

16進数ってのがあります。16で繰り上がるので、10がA、11がB...で15をFで表します。

0xFFは 0xが16進数であることを示し、はじめのFは16x15、あとのFの15とあわせて 16x15 + 15 = 255 でおなじみの?数字になります。

さて、Rでこの0xFFをコンソールに入力すると

0xFF
# [1] 255

こうなります。ちゃんと?10進数にしてくれるのですね。

しかし型を見てみると、

str(0xFF)
#  num 255

なんと?numericです。integerじゃないのか…

末尾にLをつけると整数型になる

Rで整数型にする場合は末尾にLをつけると出来ますよね。

1
# [1] 1
str(1)
#  num 1

# numericが返ってくる。

1L
# [1] 1
str(1L)
#  int 1

# integerが返ってくる

これは先の16進数でも同じで、

str(0xFF)
#  num 255
0xFFL
# [1] 255
str(0xFFL)
#  int 255

となります。だから何だって話ですが。

この、0x**の書き方について、Rの言語仕様的にどこかに書かれているのだと思うのですが未だに見つけられず。

少し古いドキュメントですけども、例えばこれ

https://cran.r-project.org/doc/contrib/manuals-jp/R-lang.jp.v110.pdf

にも書かれていません。

まぁ、動くので良いのですが。。。。

今作成中のrYMF825でこの書き方を使っているので、仕様としてどう決まっているのかなーと思った次第です。

ちなみに、 qiita.com

で知りましたが、as.hexmodeという関数があるようで

str(as.hexmode("FF"))
# Class 'hexmode'  int 255

のようにclassで扱うのですね。

さらに、read_csvで読み込む場合、0xFFは文字列として扱われてしまいます。読んだ後にas.integerすると良いと思います(型を指定するとうまく読めなかった) これはまた次回?書きますか…

このあたり(rawとか)は情報があまりないのですよね…本来の使い方じゃないからか…

Enjoy!!

追記

ホクそうむさんに教えていただきました。R Language Definitionの3.1.1や10.3.1など、にいちおう記載はありますとのことで、

cran.r-project.org

So ‘0x10L’ creates the integer value 16 from the hexadecimal representation. 
Numeric constants can also be hexadecimal, starting with ‘0x’ or ‘0x’ followed by zero or more digits, ‘a-f’ or ‘A-F’. Hexadecimal floating point constants are supported using C99 syntax, e.g. ‘0x1.1p1’.

などがありました。C99のsyntaxを見ればよいようですね。

やはり大元の情報に当たっていくのが良いですね…

改めて

Enjoy!!