C & C++ FAQ
|
|
C言語とC++言語では、各型のオブジェクトが記憶域上に占有するビット数は処理系に依存することになっています。int型のビット数を
sizeof(int) * CHAR_BITS /* 駄目 */
という式で求める方法を見かけることがあります(<limits.h>ヘッダのインクルードが必要です)。しかし、この手法は好ましくありません。たとえば、char型が8ビットで、int型が20ビットである(すなわち2バイト半である)処理系では、上の式で得られる値は24になってしまいます。
int型のビット数を求める関数の実現例を以下に示します。
/*--- unsigned型のビット数を返却 ---*/
int int_bits(void)
{
int count = 0;
unsigned x = ~0U;
while (x) {
if (x & 1U) count++;
x >>= 1;
}
return count;
}
組込み整数型のビット数は、numeric_limitsクラステンプレートのconst int型の静的データメンバdigitsとして提供されます。そのため、以下の式がint型のビット数を表すことになります(<limits>ヘッダのインクルードが必要です)。
numeric_limits<unsigned int>::digits
< >の中に、符号付きint型ではなく、符号無しint型を指定しているのは、以下の理由によります。
- 符号付き整数型と符号無し整数型のビット数は同一である。
- メンバdigitsは、『組込みの整数型の表現では、符号以外のビット数を表す』と定義されている。
■ 根拠 ■
標準C++ 1st
| 18.2.1.1
| Class template numeric_limits
|
標準C++ 2nd
| 18.2.1.1
| Class template numeric_limits
|