本「Complete Reference of C」ではchar
、デフォルトで署名されていないことが言及されています。
しかし、GCC と Visual Studio でこれを確認しようとしています。デフォルトでは署名済みと見なされます。
どちらが正しいですか?
その本は間違っています。標準では、プレーンchar
が署名されているか署名されていないかは指定されていません。
char
実際、標準では、signed char
、およびの 3 つの異なるタイプが定義されていunsigned char
ます。を#include <limits.h>
見てCHAR_MIN
から、plainchar
がsigned
or unsigned
(ifCHAR_MIN
が 0 未満または 0 に等しい) であるかどうかを確認できますが、それでも標準に関する限り、 3 つの型は区別されます。
char
このように特別であることに注意してください。変数を as として宣言するint
と、それを として宣言するのと 100% 同等になりsigned int
ます。これは、すべてのコンパイラとアーキテクチャに常に当てはまります。
Alok が指摘しているように、標準はそれを実装に任せています。
gcc の場合、デフォルトは署名されていますが、-funsigned-char
. 注: Android NDK の gcc の場合、デフォルトは unsignedです。で署名された文字を明示的に要求することもできます-fsigned-char
。
MSVC では、デフォルトは署名されていますが、/J
.
C99 N1256 ドラフト6.2.5/15 「タイプ」には、タイプの符号付き性について次のように書かれていますchar
。
実装では、signed char または unsigned char と同じ範囲、表現、および動作を持つように char を定義する必要があります。
そして脚注で:
CHAR_MIN
で定義されたには、またはのいずれか<limits.h>
の値があり、これを使用して 2 つのオプションを区別できます。どちらを選択しても、は他の 2 つとは別のタイプであり、どちらとも互換性がありません。0
SCHAR_MIN
char
ANSI C の事実上の標準本である Dennis Ritchie による C プログラミング言語の本によると、符号付きまたは符号なしのプレーン文字はマシンに依存しますが、印刷可能な文字は常に正です。