ANSI(C89 / 90)Cでバイトを表すために使用するタイプ
質問
ANSI(C89 / 90)Cのバイトを表す標準準拠の方法はありますか?私は、ほとんどの場合、文字が偶然バイトであることを知っていますが、私の理解では、これが当てはまるとは限りません。また、C99標準にはstdint.hがありますが、C99以前は何が使用されていましたか?
特に8ビットと「バイト」の両方に興味があります。 (sizeof(x)== 1)。
解決
char
は常に byte ですが、常に octet ではありません。バイトは(ほとんどの定義で)アドレス可能なメモリの最小単位であり、オクテットはメモリの8ビット単位です。
つまり、すべての実装で sizeof(char)
は常に 1 ですが、 limits.h 内の
CHAR_BIT
マクロcode>は、プラットフォームのバイトのサイズを定義し、常に8ビットであるとは限りません。プラットフォームには16ビットと32ビットのバイトがあるため、 char
はより多くのビットを使用しますが、それでも1バイトです。 char
に必要な範囲は少なくとも-127〜127(または0〜255)であるため、すべてのプラットフォームで少なくとも 8ビットになります。
ISO / IEC 9899:TC3
6.5.3.4 sizeof演算子
- ...
- sizeof演算子は、そのオペランドのサイズ(バイト単位)を生成します。これは、式または括弧付きの型名である場合があります。 [...]
- タイプが
char
、unsigned char
、またはsigned char
のオペランド(または修飾バージョン)に適用される場合その結果は 1 です。 [...]
エンファシス鉱山。
他のヒント
符号なし文字でバイトを表すことができます(8ビットを意味する場合)。サイズは常に少なくとも8ビットで、すべてのビットが値を構成するため、8ビット値が常にそれに適合します。
正確に8ビットが必要な場合、プラットフォームに依存する方法を使用する必要があると思います。 POSIXシステムは、int8_tをサポートするために必須のようです。つまり、POSIXシステムでは、char(したがって1バイト)は常に8ビットです。
ANSI C89 / ISO C90では、sizeof(char)== 1です。ただし、1バイトが8ビットであるとは限りません。 1バイトのビット数をカウントしたい場合(そして、limits.hにアクセスできない場合)、以下をお勧めします:
unsigned int bitnum(void) {
unsigned char c = ~0u; /* Thank you Jonathan. */
unsigned int v;
for(v = 0u; c; ++v)
c &= c - 1u;
return(v);
}
ここでは、Kernighanの方法を使用して、 c に設定されているビット数をカウントします。上記のコードをよりよく理解する(または他のコードを参照する)ために、" ビット調整ハック"。
C99の前に?プラットフォーム依存のコード。
しかし、なぜあなたは気にしますか? stdint.hを使用してください。
使用したCのすべての実装(古いUNIXからハードウェアエンジニアによって書かれた組み込みコンパイラ、大手ベンダーのコンパイラまで)で、 char
は常に8ビットでした。
boostでは、かなり信頼できるマクロとtypedefを見つけることができます。
一部の回答では、ワードバイトが8ビット以外のものを意味するように再定義されています。 バイトは8ビットですが、一部のc実装では、charは16ビット(2バイト)または8ビット(1バイト)です。バイトを「メモリの最小アドレス可能ユニット」またはそのようなゴミと呼んでいる人々は、バイト(8ビット)の意味の把握を失いました。 Cの一部の実装には16ビット文字(2バイト)があり、一部の実装には8ビット文字(1バイト)があり、「バイト」と呼ばれる標準タイプがないのは、遅延のためです。
したがって、int_8を使用する必要があります