"...is some inconsistency..."
いいえ、それは正しくありません。多数の矛盾、複数形があります。そのようなすべての問題に名前を付けるには、多くのページのエッセイが必要です。要約すると、C 言語が正常で、一貫性があり、論理的であると思い込むことは、最悪の場合です。
char に関する特定の問題に関して、C には、すべての整数型が暗黙的に署名されていることを保証する規則があります。たとえば、書き込みint
は常に書き込みと完全に同等signed int
です。これは には当てはまりますがint, long, short, long long
、 には当てはまりませんchar
。
これは、char が最小の整数型であるだけでなく、文字、つまり ASCII シンボル値を格納するためにも使用されるためです。char がデフォルトで符号付きか符号なしかは実装定義です。コンパイラはどちらかの形式を選択できます。
この理由は、私の記憶が正しければ、C の最初の標準化の前に C コンパイラがさまざまな方法で char を実装していたという、古い後方互換性の問題です。
char およびその他の「小さい整数型」(short および bool) に関するもう 1 つの問題は、それらが式の一部である場合は常に、より大きな整数型が昇格される方法と一致しない方法で暗黙的に型が昇格されることです。これは整数昇格規則として知られており、「通常の算術変換」(詳細はこちら) の一部であり、C が一貫性のない非論理的な言語であることを示すもう 1 つの完璧な例です。