180

本「Complete Reference of C」ではchar、デフォルトで署名されていないことが言及されています。

しかし、GCC と Visual Studio でこれを確認しようとしています。デフォルトでは署名済みと見なされます。

どちらが正しいですか?

4

6 に答える 6

234

その本は間違っています。標準では、プレーンcharが署名されているか署名されていないかは指定されていません。

char実際、標準では、signed char、およびの 3 つの異なるタイプが定義されていunsigned charます。を#include <limits.h>見てCHAR_MINから、plaincharsignedor unsigned(ifCHAR_MINが 0 未満または 0 に等しい) であるかどうかを確認できますが、それでも標準に関する限り、 3 つの型は区別されます。

charこのように特別であることに注意してください。変数を as として宣言するintと、それを として宣言するのと 100% 同等になりsigned intます。これは、すべてのコンパイラとアーキテクチャに常に当てはまります。

于 2010-01-13T06:48:09.317 に答える
74

Alok が指摘しているように、標準はそれを実装に任せています。

gcc の場合、デフォルトは署名されていますが、-funsigned-char. 注: Android NDK の gcc の場合、デフォルトは unsignedです。で署名された文字を明示的に要求することもできます-fsigned-char

MSVC では、デフォルトは署名されていますが、/J.

于 2010-01-13T06:51:52.320 に答える
39

C99 N1256 ドラフト6.2.5/15 「タイプ」には、タイプの符号付き性について次のように書かれていますchar

実装では、signed char または unsigned char と同じ範囲、表現、および動作を持つように char を定義する必要があります。

そして脚注で:

CHAR_MINで定義されたには、またはのいずれか<limits.h>の値があり、これを使用して 2 つのオプションを区別できます。どちらを選択しても、は他の 2 つとは別のタイプであり、どちらとも互換性がありません。0SCHAR_MINchar

于 2010-01-13T07:09:44.193 に答える
8

ANSI C の事実上の標準本である Dennis Ritchie による C プログラミング言語の本によると、符号付きまたは符号なしのプレーン文字はマシンに依存しますが、印刷可能な文字は常に正です。

于 2012-07-31T08:36:20.647 に答える