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 の補数の幸運な出来事 それは単なる切り捨てであるということですが、他の記号表現についても同じことが必ずしも当てはまるとは限りません。