ANSI(C89/90)Cでバイトを表すための標準に準拠した方法はありますか?ほとんどの場合、charはバイトであることがわかっていますが、これが当てはまるとは限らないことを理解しています。また、C99標準にはstdint.hがありますが、C99以前は何が使用されていましたか?
具体的には、8ビットと「バイト」(sizeof(x)== 1)の両方に興味があります。
char
は常にbyteですが、常にoctetであるとは限りません。バイトは(ほとんどの定義で)アドレス可能な最小のメモリ単位であり、オクテットは8ビットのメモリ単位です。
つまり、sizeof(char)
はすべての実装で常に1ですが、CHAR_BIT
のlimits.h
マクロはプラットフォームのバイトサイズを定義しますが、そうではありません。常に8ビット。 16ビットバイトと32ビットバイトのプラットフォームがあるため、char
はより多くのビットを使用しますが、それでも1バイトです。 char
に必要な範囲は少なくとも-127〜127(または0〜255)であるため、少なくとも8ビットオンになりますすべてのプラットフォーム。
ISO/IEC 9899:TC3
6.5.3.4sizeof演算子
- .。
- Sizeof演算子は、そのオペランドのサイズ(バイト単位)を生成します。これは、式または型の括弧で囲まれた名前の場合があります。 [...]
- タイプが
char
、unsigned char
、またはsigned char
のオペランド(またはその修飾バージョン)に適用すると、結果は1になります。 [...]
強調鉱山。
Unsigned charでいつでもバイト(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);
}
ここでは、カーニハンの方法を使用して、cに設定されているビット数をカウントします。上記のコードをよりよく理解するために(またはそのような他のコードを参照するために)、 " Bit Twiddling Hacks "を参照してください。
C99より前?プラットフォームに依存するコード。
しかし、なぜあなたは気にしますか? stdint.hを使用するだけです。
私が使用したCのすべての実装(古いUNIXから、ハードウェアエンジニアによって作成された組み込みコンパイラ、大規模ベンダーのコンパイラまで)では、char
は常に8ビットでした。