私は常にこのように理解しています。iostream
クラスの目的は、文字のストリームを読み書きすることです。考えてみれば、文字エンコーディングを使用してコンピューターによってのみ表現される抽象的なエンティティです。C++ 標準では、文字エンコーディングを固定することを避けるために多大な努力を払っており、「文字 ( char
) として宣言されたオブジェクトは、実装の基本文字セットの任意のメンバーを格納するのに十分な大きさでなければならない」とだけ述べています。 C++言語を定義するための実装基本文字セット。標準は、どの文字エンコーディングを使用するかの決定を実装 (コンパイラと STL 実装) に任せることができます。char
実装の作成者は、ISO-8859-1などのシングル オクテット エンコーディング、またはUCS-2などのダブルオクテット エンコーディングを選択できます。それは問題ではありません。char
オブジェクトが「実装の基本文字セットの任意のメンバーを格納するのに十分な大きさ」である限り(これは可変長エンコーディングを明示的に禁止していることに注意してください)、実装は互換性のない方法で基本的なラテン語を表すエンコーディングを選択することさえあります。一般的なエンコーディングで!
char
、signed char
、およびunsigned char
型の名前に「char」が含まれていることは紛らわしいですが、 は および とchar
同じ基本型のファミリーに属していないことに注意しsigned char
てunsigned char
ください。signed char
符号付き整数型のファミリに属します:
符号付き整数型には、「signed char」、「short int」、「int」、「long int」の4 つがあります。
unsigned char
符号なし整数型のファミリに属します。
それぞれの符号付き整数型には、対応する (ただし異なる)符号なし整数型が存在します: 「unsigned char」、「unsigned short int」、「unsigned int」、および「unsigned long int」...
char
、signed char
、およびタイプの 1 つの類似点unsigned char
は、「[それらは] 同じ量のストレージを占有し、同じ配置要件を持っている」ということです。したがって、実行文字セット内の文字の数値を決定するために、reinterpret_cast
~char *
を使用できます。unsigned char *
あなたの質問に答えるために、STL がデフォルトの型として使用する理由は、標準ストリームが、整数 (および) ではなく、オブジェクトchar
によって表される文字のストリームの読み取りおよび/または書き込みを目的としているためです。対数値の使用は、懸念事項を分離する方法です。char
signed char
unsigned char
char