40

テキスト表現が 0 から 255 の範囲にある「文字」を表すと想定されているのに、デフォルトで char が -128 から 127 の範囲にあるのはなぜですか? この意味で、デフォルトでは char は unsigned であるべきだと思いますが、それを「数字」のようにのみ扱うことを意図している場合に限り、「signed」キーワードを追加する必要があります。したがって、テキスト ファイルを操作するときは unsigned char を使用する必要がありますか?

また、バイナリ ファイルを操作する必要がある場合ではなく、なぜstd::ofstreamの読み取り関数と書き込み関数が使用されるのかわかりません。そこでは、署名されているかどうかは気にしませんよね?さらに、次のように使用して JPEG ファイルのコピーを正常に作成しました。charunsigned charsigned char

//..open all streams..
char c;
while(input.peek()!=EOF){
    input.read(&c,1);   //std::ifstream input;
    output.write(&c,1); //std::ofstream output;
} 
//..close all streams..

それが機能するので、 は s をread読み取りunsigned byte(画像処理では anunsigned charが一般的に使用されます) c、値が 2 の補数で偶発的な符号付き解釈を持つように設定すると思います。値のヒストグラムを作成する必要がありますが、signed char をインデックスとして使用しているため、実行時エラーが発生します。uc = (unsigned char)c;?unsigned char の読み取り/書き込みの単純なオーバーロードが少なくとも存在する可能性がある場合に、キャストを使用する必要があるのはかなり愚かではありませんか?

4

2 に答える 2

55

そうではありません。

または実装定義charではないa の署名。多くのシステムでは、デフォルトで署名されている他のタイプ ( など) と一致するように署名されていますが、一部のシステムでは署名されていない場合があります。(たとえば、 GCCに渡すとします。)signed charunsigned charint-funsigned-char

于 2013-06-13T21:40:11.143 に答える
36

標準からの答えは次のとおりです。

3.9.1 基本型 [basic.fundamental]

1 文字として宣言されたオブジェクト (char) は、実装の基本文字セットのメンバーを格納するのに十分な大きさでなければなりません。このセットの文字が文字オブジェクトに格納されている場合、その文字オブジェクトの整数値は、その文字の単一文字リテラル形式の値と等しくなります。char オブジェクトが負の値を保持できるかどうかは実装定義です。文字は、署名なしまたは署名付きで明示的に宣言できます。プレーン char、signed char、および unsigned char は、3 つの異なる型です。char、signed char、および unsigned char は、同じ量のストレージを占有し、同じ配置要件 (basic.types) を持ちます。つまり、それらは同じオブジェクト表現を持っています。文字型の場合、オブジェクト表現のすべてのビットが値表現に関与します。符号なし文字タイプの場合、値表現のすべての可能なビットパターンは数値を表します。これらの要件は、他のタイプには当てはまりません。特定の実装では、プレーンな char オブジェクトは、signed char または unsigned char と同じ値を取ることができます。どちらが実装定義です。

于 2013-06-13T21:39:54.080 に答える