最近の大多数のコンピュータは、アドレスを8ビットごとに振っています。また、ASCIIコードが7ビットということもあり、それに符号ビットを付加した8ビットが文字データの単位として扱われています。
そういった事情もあってか、1バイトといえば8ビットのことだと思いこんでいる方も多いようです。あたかも、1フィートといえば12インチとか、1ダースといえば12個のように。
C言語の規格であるJIS X3010:2003では次のように定義されています。また、C++で1バイトのビット数が処理系定義であることが明記されています。
3.6 バイト(byte) 実行環境の基本文字集合の任意の要素を保持するために十分な大きさをもつアドレス付け可能なデータ記憶域の単位。
参考 1. オブジェクトの個々のバイトのアドレスは,一意に表現できる。
2. バイトは連続するビットの列から成る。1バイト中のビットの個数は,処理系定義である。最も重みの小さいビットを最下位ビット(low-order bit)と呼び,最も重みの大きいビットを最上位ビット(high-order bit)と呼ぶ。
また、同じくJIS X3010:2003では、sizeof演算子の評価結果がオブジェクトのバイト数であると定義されています。
6.5.3.4 sizeof演算子 制約 sizeof演算子は,関数型若しくは不完全型をもつ式,それらの型の名前を括弧で囲んだもの,又はビットフィールドメンバを指し示す式に対して適用してはならない。 意味規則 sizeof演算子の結果は,そのオペランドの大きさ(バイト数)とする。
2008年にIEC 80000-13:2008で1バイトは8ビットと定義されたのですが、C言語やC++では、その後の規格(C17やC++20など)でも1バイトのビット数は処理系定義のままになっています。
では、C言語やC++における1バイトは実際に何ビットになっているかというと、<limits.h>ヘッダで定義されるCHAR_BITマクロがそれを表しています。CHAR_BITマクロは少なくとも8以上に定義されることが保証されています。すなわち、1バイトが9ビットであったり、16ビットであったり、64ビットであったとしても、規格上は何ら問題ありませんし、そうした処理系が実際に存在します。
というわけですので、少なくともC言語やC++に限れば「バイト」という単位を8ビットの意味で使うのは正しくありません。また、sizeof演算子の評価結果がオペランドの型のバイト数ということになります。