[迷信] 1 バイトは 8 ビット

最近の大多数のコンピュータは、アドレスを 8 ビットごとに振っています。また、ASCII コードが 7 ビットということもあり、それに符号ビットを付加した 8 ビットが文字データの単位として扱われています。

そういった事情もあってか、1 バイトといえば 8 ビットのことだと思いこんでいる方も多いようです。あたかも、1 フィートといえば 12 インチとか、1 ダースといえば 12 個のように。

しかし、C/C++の言語規格では、1 バイトが 8 ビットだという定義はどこにもありません。定義されているのは、char 型のサイズが 1 バイトだということです。そして、char 型のビット数は、CHAR_BIT マクロで定義されます。

CHAR_BIT マクロは、<limits.h> ヘッダで定義されるマクロで、少なくとも 8 以上に定義されることが保証されています。すなわち、1 バイトが 9 ビットであったり、16 ビットであったり、64 ビットであったとしても、規格上は何ら問題ありませんし、そうした処理系が実際に存在します。

というわけですので、少なくともC/C++に限れば、「バイト」という単位を 8 ビットの意味で使うのは正しくありません。正しい認識としては、sizeof 演算子の評価結果が、オペランドの型のバイト数ということになります。

なお、char 型(signed char 型、または unsigned char 型)へのポインタの減算結果も、単位はバイトということになります。