web-dev-qa-db-ja.com

ANSI(C89 / 90)Cでバイトを表すために使用するタイプ?

ANSI(C89/90)Cでバイトを表すための標準に準拠した方法はありますか?ほとんどの場合、charはバイトであることがわかっていますが、これが当てはまるとは限らないことを理解しています。また、C99標準にはstdint.hがありますが、C99以前は何が使用されていましたか?

具体的には、8ビットと「バイト」(sizeof(x)== 1)の両方に興味があります。

34
Sydius

charは常にbyteですが、常にoctetであるとは限りません。バイトは(ほとんどの定義で)アドレス可能な最小のメモリ単位であり、オクテットは8ビットのメモリ単位です。

つまり、sizeof(char)はすべての実装で常に1ですが、CHAR_BITlimits.hマクロはプラットフォームのバイトサイズを定義しますが、そうではありません。常に8ビット。 16ビットバイトと32ビットバイトのプラットフォームがあるため、charはより多くのビットを使用しますが、それでも1バイトです。 charに必要な範囲は少なくとも-127〜127(または0〜255)であるため、少なくとも8ビットオンになりますすべてのプラットフォーム。

ISO/IEC 9899:TC3

6.5.3.4sizeof演算子

  1. .。
  2. Sizeof演算子は、そのオペランドのサイズ(バイト単位)を生成します。これは、式または型の括弧で囲まれた名前の場合があります。 [...]
  3. タイプがcharunsigned char、またはsigned charのオペランド(またはその修飾バージョン)に適用すると、結果は1になります。 [...]

強調鉱山。

65
Alex B

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 "を参照してください。

3
anon

C99より前?プラットフォームに依存するコード。

しかし、なぜあなたは気にしますか? stdint.hを使用するだけです。

私が使用したCのすべての実装(古いUNIXから、ハードウェアエンジニアによって作成された組み込みコンパイラ、大規模ベンダーのコンパイラまで)では、charは常に8ビットでした。

1
Frank Krueger