通信用語の基礎知識 全国のICカードこれひとつ 戻る

CHAR_BIT
辞書:電算用語の基礎知識 プログラミング仕様編 (PTPROGS)
読み:チャー-アンダースコア-ビット
外語: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;
}
リンク
用語の所属
C
C++
関連する用語
char

[再検索] [戻る]


通信用語の基礎知識検索システム WDIC Explorer Ver 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club
KisoDic