unsigned char とは何ですか?

C++ では、3 つの 異なる 文字タイプ:

  • char
  • signed char
  • unsigned char

テキストに文字タイプを使用している場合 、修飾されていない char を使用します :

  • 'a' のような文字リテラルの型です または '0' .
  • "abcde" のような C 文字列を構成する型です

数値としても機能しますが、その値が符号付きまたは符号なしとして扱われるかどうかは指定されていません。不等式による文字比較に注意してください - ただし、ASCII (0-127) に限定すればほぼ安全です.

文字タイプを数字として使用している場合 、使用:

  • signed char 、これで 少なくとも -127 から 127 の範囲。 (-128 ~ 127 が一般的)
  • unsigned char 、これで 少なくとも 0 から 255 の範囲

「少なくとも」。C++ 標準では、各数値型がカバーする必要がある値の最小範囲のみを示しているためです。 sizeof (char) は 1 (つまり 1 バイト) である必要がありますが、理論的には 1 バイトはたとえば 32 ビットである可能性があります。 sizeof そのサイズは 1 として報告されます - できるという意味 sizeof (char) == sizeof (long) == 1 を持っている .


C 標準では char の符号付き性が定義されていないため、これは実装に依存します。 .プラットフォームによっては、char が signed の場合があります。 または unsigned 、したがって、明示的に signed char を要求する必要があります または unsigned char 実装がそれに依存している場合。 char を使用するだけです 文字列から文字を表現する場合、これはプラットフォームが文字列に入れるものと一致するためです。

signed char の違い と unsigned char ご想像のとおりです。ほとんどのプラットフォームでは、signed char -128 の範囲の 8 ビットの 2 の補数になります 127 へ 、および unsigned char 8 ビットの符号なし整数 (0 255 へ )。標準は char を必要としないことに注意してください 型には 8 ビットがあり、その sizeof(char) だけです 1 を返す . CHAR_BIT で char のビット数を取得できます limits.h で .今日、これが 8 以外になるプラットフォームはほとんどありません。

ここに、この問題のすばらしい要約があります。

私がこれを投稿して以来、他の人が言及しているように、 int8_t を使用する方が良いでしょう と uint8_t 本当に小さな整数を表現したい場合。


本当に必要だと思うので、C と C++ のいくつかの規則を述べたいと思います (この点では同じです)。まず、すべて unsigned char の unsigned char オブジェクトがある場合、値の決定に参加します。第二に、unsigned char 明示的に署名されていないと述べられています。

さて、値 -1 を変換するとどうなるかについて誰かと議論しました int 型から unsigned char まで .彼は結果として unsigned char という考えを拒否しました 彼は符号表現を心配していたので、すべてのビットが 1 に設定されています。しかし、彼はそうする必要はありません。変換が意図したとおりに行われるのは、この規則の直後です:

それは数学的な説明です。 C++ では、モジュロ計算の観点から記述されており、同じ規則が適用されます。とにかく、そうでないもの 整数 -1 のすべてのビットが 変換前のものです。では、結果の unsigned char が すべての CHAR_BIT を持っています ビットは 1 になりましたか?

<オール>
  • すべてのビットがその値の決定に関与します。つまり、オブジェクトにパディング ビットは発生しません。
  • 一度だけ追加 UCHAR_MAX+1 -1 へ 範囲内の値、つまり UCHAR_MAX が生成されます
  • 実際、それで十分です!したがって、unsigned char が必要なときはいつでも すべてのビットを 1 にすると、そうします

    unsigned char c = (unsigned char)-1;
    

    また、変換はではないことにもなります 上位ビットを切り捨てるだけです。 2 の補数の幸運な出来事 それは単なる切り捨てであるということですが、他の記号表現についても同じことが必ずしも当てはまるとは限りません。