ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
C/C++の標準で定義されるマクロ定数。char型のビット長を表わす。
limits.h
#define CHAR_BIT 8
必ずしもlimits.h内とは限らないが、limits.hをincludeすれば定義される。
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が定義されている。
CHAR_BITはcharのビット長を指す。しかし、longが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; }
コメントなどを投稿するフォームは、日本語対応時のみ表示されます