C ++ストリームがunsigned charの代わりにcharを使用するのはなぜですか?

StackOverflow https://stackoverflow.com/questions/277655

質問

C ++標準ライブラリがbasic_ [io] streamとそのすべてのバリアントを、 unsigned char 型の代わりに char 型を使用してインスタンス化した理由を常に疑問に思っていました。 char は、(署名されているかどうかに応じて)get()などの操作でオーバーフローとアンダーフローを引き起こす可能性があることを意味し、関連する変数の実装定義値につながります。別の例は、 put 関数を使用して、未フォーマットのバイトをostreamに出力する場合です。

アイデアはありますか


:まだ確信が持てません。そのため、最終的な答えを知っていれば、実際に投稿することができます。

役に立ちましたか?

解決

おそらく質問を誤解したかもしれませんが、unsigned charからcharへの変換は不特定ではなく、実装依存です(C ++標準では4.7-3)。

C ++の1バイト文字のタイプは「char」であり、「unsigned char」ではありません。これにより、実装でプラットフォーム上で最善を尽くすもう少しの自由が与えられます(たとえば、標準化団体は、符号付きバイト演算が符号なしバイト演算よりも高速であるCPUが存在すると信じているかもしれませんが、それは私の推測です)。また、Cとの互換性のため。C++からこの種の実存的不確実性を除去した結果はC#です;-)

「char」がtypeが存在する場合、その署名が定義されていなくても、通常のストリームで使用するのが理にかなっていると思います。それで、「C ++がcharを符号なしに定義しなかったのはなぜですか」

他のヒント

私は常にこのように理解していました: iostream クラスの目的は、文字のストリームを読み書きすることです。文字エンコードを使用してコンピューターによって表されます。 C ++標準では、文字エンコード( char )として宣言されたオブジェクトのみが、実装の基本文字セットのメンバーを格納するのに十分な大きさでなければならないということで、文字エンコードのピン止めを避けるために苦労しています。 「実装の基本文字セット」を強制する必要がないためです。 C ++言語を定義します。標準では、どの文字エンコーディングを実装に使用するかを決定することができます(STL実装と一緒にコンパイラ)、 char オブジェクトはいくつかのエンコーディングで単一の文字を表すことに注意してください。

実装ライターは、 ISO-8859-1 <などの単一オクテットエンコーディングを選択できますまたは UCS-2 などのダブルオクテットエンコーディング。関係ありません。 char オブジェクトが「実装の基本的な文字セットのメンバーを格納するのに十分な大きさ」である限り、 (これは可変長エンコーディングを明示的に禁止していることに注意してください)、実装は一般的なエンコーディングと互換性のない方法で基本的なラテン語を表すエンコーディング!

char signed char 、および unsigned char のタイプが&quot; char&quot;を共有しているのはわかりにくいです。ただし、 char signed char および unsigned char 。 signed char は符号付き整数型のファミリーです:

  

符号付き整数型があります:&quot; signed char&quot;、&quot; short int&quot;、&quot; int&quot;、&quot; long int&quot;

および unsigned char は、符号なし整数型のファミリーです:

  

各符号付き整数型には、対応する(ただし異なる)符号なし整数型が存在します:&quot; unsigned char&quot;、&quot; unsigned short int&quot;、&quot; unsigned int&quot ;、 &quot; unsigned long int、&quot; ...

char signed char 、および unsigned char のタイプの1つの類似点は、&quot; [they]が同じ量を占めることですストレージと同じアライメント要件がある」したがって、 char * から unsigned char * reinterpret_cast して、実行文字セットの文字の数値を決定できます。

質問に答えるために、STLが char をデフォルトのタイプとして使用する理由は、標準ストリームが char オブジェクト。整数ではありません( signed char および unsigned char )。 char と数値の使用は、懸念事項を分離する方法です。

charは文字用、unsigned charはデータの生バイト用、signed charsは署名済みデータ用です。

標準では、charの実装にsigned charまたはunsigned charのどちらを使用するかは指定されていません-コンパイラ固有です。 &quot; char&quot;のみを指定します。 「十分」になりますシステムにキャラクターを保持する-当時のキャラクターの状態、つまりユニコードなし。

&quot; char&quot;の使用キャラクターの場合は標準的な方法です。 unsigned charの使用はハックですが、ほとんどのプラットフォームでのコンパイラのcharの実装と一致します。

これのコメントで説明されていると思います。引用するには:

  

signed charおよびunsigned charは、intおよびunsigned intと同様の算術整数型です。一方、charは明示的に「I / O」になることを意図しています。プラットフォーム上のデータの不透明でシステム固有の基本単位を表すタイプ。私はこの精神でそれらを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top