型とサイズ
毎日書くのは難しい。
今回はC++においての型の大きさの話。
Cの型のサイズの話はググるとよくひっかかるのに、C++の場合はそれほど見ない。
規格が手元に無いので正確なことは不明だが、おそらく大部分はCの定義を引き継いできているのだろう。
そんなわけで不正確な情報が混じるかもしれないが、まとめてみる。
C++では組み込み型として以下が提供されている。
// 文字型 char wchar_t // 整数型 short int int long int long long int // 実数型 float double long double // 論理型 bool
short int, long int, long long int
については最後のint
を省略することができる。
整数型と文字型については先頭にsigned / unsigned
をつけることができる。
先頭に何も付けない場合は、整数型についてはsigned
を指定した場合と同等の動作となる。
文字型の場合はsigned / unsigned
どちらになるかは処理系定義である。
前提として、1byteが何bitであるかは定義されていない。しかし、一部を除いた大半の処理系は、1byteが8bitとして実装されている。
char
のサイズはsizeof(char) == 1
となり、sizeof
はバイト数を返すため、char
のサイズは1byteとなる*1。
wchar_t
のサイズは処理系定義であり、ワイド文字*2を表現するのに必要な大きさが割り当てられる。
short int
は最低16bitを持つ。
int
は最低16bitを持ち、short int
と同等かより大きいサイズを持つ。
long int
は最低32bitを持ち、int
と同等かより大きいサイズを持つ。
long long int
は最低64bitを持ち、long int
と同等かより大きいサイズを持つ。
float
は値を表現するのに適当な大きさを持つ。
double
は値を表現するのに適当な大きさを持ち、float
と同等かより大きいサイズを持つ。
long double
は値を表現するのに適当な大きさを持ち、double
と同等かより大きいサイズを持つ。
bool
は値を表現するのに適当な大きさを持つ。
以上をまとめると、××型のサイズは○byteです!なんて言いきってる資料は当てにならない。
「大きさはコンパイラによって異なるよ」の一言でいいから付け加えてやればいいのに。
はい、いきなりですがこういう問題に終止符を打つために、C++11にはcstdint
という標準ライブラリヘッダがあります。
ヘッダ内には以下のようなtypedefが定義されています(一部抜粋)。
// 符号あり、最低で8bitが保障される演算が高速な整数型 int_fast8_t // 符号なし、最低で8bitが保障される演算が高速な整数型 uint_fast8_t // 符号あり、最低で16bitが保障される演算が高速な整数型 int_fast16_t // 符号あり、最低で8bitが保障されるうちの最小の整数型 int_least8_t // 符号なし、最低で32bitが保障されるうちの最小の整数型 uint_least32_t // 符号あり、最低で64bitが保障されるうちの最小の整数型 int_least64_t // 符号あり、最大の整数型 intmax_t
最低限の精度保証が必要な場合は、これを使って明示するといいんじゃないかな。