最近の大多数のコンピュータは、アドレスを 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" を削除してトラックバックを送信してください。
ブックナビゲーション
- 技術情報
- Boost C++ Libraries メモ
- C++と組込み環境
- C++サンプル集
- C++テンプレート集
- C++プログラマのためのC言語入門
- C/C++迷信集
- [迷信] 'A'~'Z' の値は連続している
- [迷信] 0xe-0xe はゼロ
- [迷信] 1 バイトは 8 ビット
- [迷信] 2の累乗による割り算と右シフトは等価
- [迷信] FILE 型は構造体
- [迷信] abs は常に非負の値を返す
- [迷信] argv[0] はプログラム名
- [迷信] char 型は符号付き
- [迷信] double の出力書式は "%lf"
- [迷信] fflush で入力バッファをクリア
- [迷信] free でメモリを開放する
- [迷信] free に NULL を渡すとクラッシュする
- [迷信] gets は単純に fgets に置き換えられる
- [迷信] isalpha 関数の引数は char 型
- [迷信] new に失敗すると NULL が返る。
- [迷信] scanf ではバッファオーバーランを防げない
- [迷信] scanf でキーボードから入力
- [迷信] setjmp マクロの返却値は変数に代入できる
- [迷信] sizeof は定数式
- [迷信] void main(void)
- [迷信] とりあえず memset で初期化
- [迷信] アルゴリズム関数内で関数オブジェクトはコピーされない
- [迷信] オブジェクトの動的生成に失敗するとメモリリークする
- [迷信] コンストラクタから例外を送出してはならない
- [迷信] コンストラクタで自身をゼロクリア
- [迷信] コンパイラはプログラマの心を察してくれる
- [迷信] コンパイルエラーが出るのでアクセス指定子を修正
- [迷信] ソースコード中の即値を全廃せよ
- [迷信] ソースファイルの末尾に }
- [迷信] データ列のソートには qsort 関数を使うべし
- [迷信] プログラムは必ず main から始まる
- [迷信] 一重引用符の中には一文字しか書けない
- [迷信] 今どき int が 16 ビットの処理系なんて無い
- [迷信] 入力データ格納用配列のサイズは BUFSIZ
- [迷信] 割付けたメモリはプログラマが自分で解放しなければならない
- [迷信] 実数型とは浮動小数点型のことである
- [迷信] 引用符で囲んだヘッダ名はカレントディレクトリから探索する
- [迷信] 文字列から整数への変換には atoi
- [迷信] 構造体のタグ名は下線で始める
- [迷信] 構造体はクラスではない
- [迷信] 識別子に使える文字は英数字と下線のみ
- [迷信] 非局所オブジェクトは外部結合
- C言語再入門
- C言語徹底入門
- Drupal メモ
- TOPPERS 情報
- ライブラリ開発入門
- 分割コンパイルをきわめる
- 擬似プロセッサを作る
- 車輪の再発明
- 過去の情報


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