通信用語の基礎知識 IPv4
戻る
参加者募集中

CHAR_BIT

辞書:電算用語の基礎知識 プログラミング仕様編 (PTPROGS)
読み:チャー・アンダースコア・ビット
読み:キャラ・アンダースコア・ビット
外語:CHAR_BIT 英語
品詞:名詞
2013/04/17 作成
2015/08/06 更新

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

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.01e (14-Jun-2018)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club