C++ 標準は特定の「符号付き」であることを定義していないため、複数のプラットフォーム用にコンパイルすると惨めに失敗しますchar
。
したがって、GCC は、特定の動作を強制するオプションを導入-fsigned-char
しています。-funsigned-char
このトピックの詳細については、たとえば、こちらを参照してください。
編集:
壊れたコードの例を尋ねられたように、バイナリ データを処理するコードが壊れる可能性はたくさんあります。たとえば、8 ビットのオーディオ サンプル (範囲 -128 ~ 127) を処理し、音量を半分にしたい画像。ここで、次のシナリオを想像してください (素朴なプログラマーは を想定していますchar == signed char
)。
char sampleIn;
// If the sample is -1 (= almost silent), and the compiler treats char as unsigned,
// then the value of 'sampleIn' will be 255
read_one_byte_sample(&sampleIn);
// Ok, halven the volume. The value will be 127!
char sampleOut = sampleOut / 2;
// And write the processed sample to the output file, for example.
// (unsigned char)127 has the exact same bit pattern as (signed char)127,
// so this will write a sample with the loudest volume!!
write_one_byte_sample_to_output_file(&sampleOut);
この例を気に入っていただければ幸いです ;-) しかし、正直なところ、覚えている限り、初心者でさえ、そのような問題に実際に遭遇したことはありません...
この回答があなたの反対投票者にとって十分であることを願っています。短いコメントはどうですか?