[迷信] 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 型)へのポインタの減算結果も、単位はバイトということになります。

トラックバック


URL から "-nospam" を削除してトラックバックを送信してください。

なので、たとえば Unicode

なので、たとえば Unicode などで「8ビット」を表す用語としては、オクテット (octet) が使われる。

というか...

C/C++では、少なくとも言語レベルでは1バイトより小さい単位で入出力を行うことはできませんので、正確に8ビットを表す用語を作っても無意味かと思います。
UnicodeはUnicodeでの規定をもうければよいので、C/C++がどんなルールになっているかは関係ありませんね。
もちろん、規格によってバイトの定義がいろいろあるのが不便なのは間違いありませんので、バイト以外に8ビットを表現する用語があれば便利なのは確かです。

このエントリーを含むはてなブックマーク