ゆき社長

シーゲンガーのお勉強 ゲームプログラマ、ゲーマー、色々!

json11 int64_t

C++におけるC++ライブラリの選択肢は色々ある

前は picoJsonを愛用していて、今でも十分に 小さく使いやすい

ヘッダのみで利用できるので、場合によっては今でも使う

けど、json11が評判いいし使っています

実際に使いやすい

ところが json11は uint32、int64、uint64 等がない。

全部において int_value である

プロトタイプをみると intである

C++においては、整数型とビット数が、規格ではちゃんと決まっていない。

処理系やコンパイラでビット数が異なる

一般的な64bitマシンではおおよそ

int: 32bit

long: 32bit

long long: 64bit

である

つまりおおよその処理系では json11の int_value() では 符号あり32bit数しかとれない

そこで double_value() を使って取ると、ちゃんと調査してないけど

53bitまでは取れるはずなので

uint32は取れる

が、int64、uint64に関しては 53ビットしか取れないため、残りの11bit情報が取れない

とりあえず jsonデータを stringにし、内部でint64に変換するのが 楽な気がする

一般的に Javaでも jsonライブラリはライブラリ毎に その辺りも微妙に事情が違うので

今のところは stringで受け渡しすることにした

そのうち json11も uint32 int64 uint64対応入れたいけどね。。。

そして 文字列から int64_tに変換するには おそらく  std::atoll で良いと思う

ただし long long == int64  の処理系限定である

もし long long != int64 処理系だと・・・

この際のベストプラクティスは何なのか・・・

悩みは色々あるけど、64bit環境では おそらくこれで大丈夫かと

ちなみに uint64_tが欲しい時は std::uatoll が使える