55

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

何か案は?


:私はまだ確信が持てません。したがって、決定的な答えがわかっている場合でも、実際に投稿できます。

4

4 に答える 4

29

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

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

「char」型が存在することを考えると、その署名が定義されていなくても、通常のストリームでそれを使用することは理にかなっていると思います。したがって、おそらくあなたの質問は、「なぜ C++ は char を unsigned と定義しなかったのですか?」という答えで答えられるでしょう。

于 2008-11-10T11:43:03.127 に答える
15

私は常にこのように理解しています。iostreamクラスの目的は、文字のストリームを読み書きすることです。考えてみれば、文字エンコーディングを使用してコンピューターによってのみ表現される抽象的なエンティティです。C++ 標準では、文字エンコーディングを固定することを避けるために多大な努力を払っており、「文字 ( char) として宣言されたオブジェクトは、実装の基本文字セットの任意のメンバーを格納するのに十分な大きさでなければならない」とだけ述べています。 C++言語を定義するための実装基本文字セット。標準は、どの文字エンコーディングを使用するかの決定を実装 (コンパイラと STL 実装) に任せることができます。char

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

charsigned char、およびunsigned char型の名前に「char」が含まれていることは紛らわしいですが、 は および とchar同じ基本型のファミリーに属していないことに注意しsigned charunsigned charください。signed char符号付き整数型のファミリに属します:

符号付き整数型には、「signed char」、「short int」、「int」、「long int」の4 つがあります。

unsigned char符号なし整数型のファミリに属します。

それぞれの符号付き整数型には、対応する (ただし異なる)符号なし整数型が存在します: 「unsigned char」、「unsigned short int」、「unsigned int」、および「unsigned long int」...

charsigned char、およびタイプの 1 つの類似点unsigned charは、「[それらは] 同じ量のストレージを占有し、同じ配置要件を持っている」ということです。したがって、実行文字セット内の文字の数値を決定するために、reinterpret_castchar *を使用できます。unsigned char *

あなたの質問に答えるために、STL がデフォルトの型として使用する理由は、標準ストリームが、整数 (および) ではなく、オブジェクトcharによって表される文字のストリームの読み取りおよび/または書き込みを目的としているためです。対数値の使用は、懸念事項を分離する方法です。charsigned charunsigned charchar

于 2010-05-27T19:51:09.133 に答える
4

char は文字用、unsigned char はデータの raw バイト用、signed chars は署名付きデータ用です。

標準では、char の実装に signed または unsigned char を使用するかどうかを指定していません。これはコンパイラ固有です。「char」がシステムで文字を保持するのに「十分」であることを指定するだけです-当時の文字のように、つまりUNICODEはありません。

文字に「char」を使用するのが標準的な方法です。unsigned char の使用はハックですが、ほとんどのプラットフォームでのコンパイラの char の実装と一致します。

于 2008-11-10T11:44:19.787 に答える
0

このコメントはそれをよく説明していると思います。引用するには:

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

于 2012-05-20T11:10:38.293 に答える