質問

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演算子

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

エンファシス鉱山。

他のヒント

符号なし文字でバイトを表すことができます(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を使用する必要があります

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top