unsigned char
文字エンコードまたはバイナリバッファで動作する一部のライブラリのように、バイナリデータを保持するために使用する必要が本当にありますか?私の質問を理解するために、以下のコードを見てください-
char c[5], d[5];
c[0] = 0xF0;
c[1] = 0xA4;
c[2] = 0xAD;
c[3] = 0xA2;
c[4] = '\0';
printf("%s\n", c);
memcpy(d, c, 5);
printf("%s\n", d);
両方とも正しくprintf's
出力されます。ここで、は16進数のUnicodeコードポイントのエンコーディングです。f0 a4 ad a2
U+24B62 ()
memcpy
charが保持するビットも正しくコピーしました。
unsigned char
の代わりにの使用を提唱する可能性のある理由は何plain char
ですか?
他の関連する質問unsigned char
では、C仕様によってパディングがないことが保証されている唯一の(バイト/最小)データ型であるため、強調表示されています。しかし、上記の例が示しているように、出力はパディング自体の影響を受けていないようです。
上記をコンパイルするためにVC++Express2010とMinGWを使用しました。VCは警告を出しましたが
warning C4309: '=' : truncation of constant value
出力はそれを反映していないようです。
PSこれは重複の可能性があるとマークされる可能性がありますバイトのバッファは符号付きまたは符号なしのcharバッファですか?しかし、私の意図は異なります。うまく機能しているように見えるものをchar
入力する必要があるのはなぜunsigned char
ですか?
更新: N3337から引用するには、
Section 3.9 Types
2自明にコピー可能なタイプTのオブジェクト(基本クラスのサブオブジェクトを除く)の場合、オブジェクトがタイプTの有効な値を保持しているかどうかに関係なく、オブジェクトを構成する基になるバイト(1.7)をcharの配列にコピーできます。またはunsignedchar。charまたはunsignedcharの配列の内容がオブジェクトにコピーバックされた場合、オブジェクトはその後元の値を保持する必要があります。
上記の事実と、私の元の例がchar
デフォルトでに設定されているIntelマシン上にあったことを考慮すると、よりも優先されるべきsigned char
かどうかはまだ確信が持てません。unsigned char
char
他に何か?