CHAR_BIT
読み:チャー-アンダースコア-ビット
外語:CHAR_BIT
C/C++の標準で定義されるマクロ定数。char型のビット長を表わす。
定義
limits.h
#define CHAR_BIT 8
必ずしもlimits.h内とは限らないが、limits.hをincludeすれば定義される。
特徴
FreeBSD
FreeBSDでは、次のように定義される。
machine/_limits.h
#define __CHAR_BIT 8 /* number of bits in a char */
sys/limits.h
#define CHAR_BIT __CHAR_BIT
x86用FreeBSDでは、間接的に8が定義されている。
Linux
Linuxでは、ユーザー空間ではC標準としてCHAR_BITを定義する。
ただしカーネル空間ではCHAR_BITは定義されていない。
補足
有効ビット長
CHAR_BITはcharのビット長を指す。しかし、longが32ビット長だったとしても、次の例は必ずしも正しくない。
sizeof(long) * CHAR_BIT == 32 /* ? */
大部分の処理系では有効であり、またこのようにして実装されている処理も大量に存在するが、しかしこれは常に成立することが保障されていない。
つまり、次がいえる。
sizeof(型名) * CHAR_BIT != 有効ビット数
これは例えば、アラインメントの関係でパディング(詰め物)が入った場合に発生しうる。中途半端な長さの型があった場合、これを32ビット境界で整列させたときにはパディングが生じるが、sizeofはパディングも含めたサイズを返す。このため、この計算では有効ビット数が得られないことになる。
移植性を考慮に入れるのであれば、sizeof(型名) * CHAR_BITを有効ビット長として用いるべきではない。
安全な算出方法
環境依存しないで有効ビット数を求めるには、例えばunsigned longの本当の長さを知りたい場合は、プログラムでビット数を数える以外にはない。
規格で定義されている最大値のマクロ定数を用いれば、環境依存しないものと思われる。
#include <stddef.h>
#include <limits.h>
size_t bitnum_of_long(void)
{
unsigned long n = ULONG_MAX;
size_t bit;
for (bit = 0; n; n >>= 1, ++bit);
return bit;
}
再検索