C/C++ / 固定幅整数型

現在、この記事をgentoo Linux x86 (default/linux/x86/13.0/desktop)環境下で記述しています。今のご時世ながら32bit機という様です。

というのも、所持している64bit機はデスクトップであり、現在使用中のこいつはノートパソコン。可搬性に軍配があがり、マシンパワーを必要としない作業を担当してもらっています。あっと、64bit機の方もgentooです。amd64ですね。はい、gentoo心酔してます。

プログラミングをしていると、32bitと64bitの環境の両方で動かさなければならない状況に出くわします。

あまり、詳しくないですが、Javaなんかは32bit固定で済んだりした記憶があるのですが、C/C++だとその辺の差異をソースコードレベルで吸収してやらないとうまく動かないプログラムを記述してしまいます。

浮動小数点型は、float(32bit), double(64bit)と固定されています。反面、整数型はintがアーキテクチャの都合のよいサイズ(幅)を使用してよいことになっています。これが問題で、独自ファイルフォーマットなんかを作るときには、エンディアンと並んで注意しなければならない部分の一歩目となります。

そこで多用することになるのが、C99以降の規格で追加となった下記の型です。

  • int8_t
  • int16_bt
  • int32_t
  • int64_t
  • intptr_t
  • uint8_t
  • uint16_t
  • uint32_t
  • uint64_t
  • uintptr_t
  • ptrdiff_t

intX_tはsigned、uintX_tはunsignedです。 便利なのが、uintptr_tでポインタ型のサイズを格納できる符号なし整数型になります。32bit環境ならuint32_t、64bit環境ならuint64_tとなる、と。

これらを使用するには


#include <stdint.h>

と宣言すればよいのですが。C99はC++03以降で策定されたので、純粋なC++03環境ではヘッダが存在しません。

まぁ、大概はコンパイラが付属してくれているような気もしますが、気になる場合はboostを使うのがよいかと思います。


#include <boost/cstdint.hpp>

また、C++11環境では、


#include <cstdint>

と宣言することで、使用可能になります。

ここでは、参考として下記サイトをあげさせていただきます。

http://cpprefjp.github.io/reference/cstdint.html

ただ、intX_t, uintX_tは"実装は処理系定義による"とのことなので、上記リンクにあるleastやfastを使って方が(厳密には)よいということなのかもしれません。

固定幅整数型の話は多くのブログでも取り上げられていますし、より詳しい記述も多数見受けられますが、自分への注意喚起ということも含めて取り上げました。

0 件のコメント:

コメントを投稿