技術ブログとか

C/C++/C#/DirectX/Effect

型とサイズ

毎日書くのは難しい。

今回は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

最低限の精度保証が必要な場合は、これを使って明示するといいんじゃないかな。

 

*1:どうでもいいけど、sizeofって演算子だからsizeof charって書いても何の問題も無い。

*2:マルチバイト文字とは違う。マルチバイト文字は1文字が何byteかは文字によって異なるが、ワイド文字は1文字が何byteかは完全に固定されている。