バイトを表す型¶
C++ では以下の型のサイズが1バイトと規定されています。 C でも同様です。
char
signed char
unsigned char
ビットを取り扱う際には符号なしであることが望ましいため、
バイトを表す型としては unsigned char
を使用します。
char は signed char とは異なる型
以下の型はすべて異なる型として扱われます。
char
signed char
unsigned char
異なる型であるため、次のようなオーバーロードが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
char
は処理系で最も効率的に処理できる文字表現の型です。
char
のビット表現は signed char
または unsigned char
のいずれか一方と一致しますが、どちらと一致するかは処理系依存です。
C++17 で追加された std::byte
文字とバイトデータの用途を明確にするため、 C++17 で std::byte という型が追加されました。
C++17 の機能であるため C++11 では使用できません。
1バイトは8ビットとは限らない¶
2008年に発行された IEC 80000-13 にて $1 byte = 8 bits$ と正式に定義されました。
それ以前は 処理系が1つのアドレスで扱うビット数 (メモリ操作の最小単位) を 1バイトと定めることが多く、 $1 byte = 8 bits$ とは限らず $1 byte = 7 bits$ や $1 byte = 9 bits$ となることもありました。
C や C++ では以下の制約によって $1 byte = 8 bits$ 以上と規定しています。
char
型のサイズを1バイトとするchar
型のビット数 CHAR_BIT は8ビット以上とする
C や C++ では $1 byte = 7 bits$ は許容されませんが、 $1 byte = 9 bits$ は許容されています。
実際には $1 byte = 8 bits$ ではない処理系は非常に少ないため、 $1 byte = 8 bits$ だけを想定した実装にすることも多いです。
$1 byte = 8 bits$ しか想定していないことを表明する必要があれば 次のようにします。
#include <climits>
static_assert(CHAR_BIT == 8, "Not support 1byte != 8bits");