char はデフォルトで署名付きですか?それとも署名なしですか?
質問
『Complete Reference of C』という本では次のように述べられています。 char
デフォルトでは署名されていません。
しかし、私はこれを Visual Studio だけでなく GCC でも検証しようとしています。それは次のように捉えています 署名済み デフォルトでは。
どちらが正しいか?
解決
この本は間違っています。平野char
は、符号付きまたは符号なしている場合、標準では指定しません。
char
、signed char
、及びunsigned char
:実際には、標準は、3つの異なるタイプを定義します。あなたは#include <limits.h>
、その後CHAR_MIN
を見れば、プレーンchar
がsigned
かunsigned
であれば、あなたは見つけることができます(CHAR_MIN
が0未満または0と等しい場合)、それでも、の3つのタイプがの別個のものであるとして、これまでの標準として懸念している。
char
は、このように特別であることに注意してください。あなたはint
として変数を宣言する場合は、signed int
としてそれを宣言すると100%同じです。これは、常にすべてのコンパイラおよびアーキテクチャにも当てはまります。
他のヒント
として アロクが指摘する, 、標準では実装に任せています。
gcc の場合、デフォルトは署名されていますが、次のように変更できます。 -funsigned-char
. 注記: Android NDK の gcc の場合、デフォルトは署名なしです. 。次のコマンドを使用して、署名付き文字を明示的に要求することもできます。 -fsigned-char
.
MSVC では、デフォルトは署名されていますが、次のように変更できます。 /J
.
C99 N1256ドラフトの6.2.5 / 15「タイプ」タイプのchar
の署名ネスについて言うために、このあります:
の実装は、signed char型またはunsigned charのいずれかと同じ範囲、表現、及び挙動を有するように文字を定義しなければならない。
と脚注でます:
CHAR_MIN
は、<limits.h>
で定義され、値0
又はSCHAR_MIN
のいずれかを有するであろう、そしてこの2つのオプションを区別するために使用することができます。かかわらず行った選択の、char
は、他の2つとは別のタイプであり、どちらかと互換性がありません。
ANSI Cのためのデファクトスタンダードブックであるデニス・リッチーによるCプログラミング言語の本によれば、普通文字符号付きまたは符号なしのいずれかでは、マシンに依存しているが、印刷可能な文字は常に正である。
C標準によれば普通チャーの符号の有無「は実装が定義される」。
は、一般的な実装では、そのアーキテクチャを実装するために、より効率的であった方を選びました。 x86システムでチャーは、一般的に署名されます。それは一般的に署名され、アームシステムでは(アップル社のiOSは例外です)。
ビャーネ・ストロヴストルップよる「C ++プログラミング言語」によれば、char
「は実装が定義されます」。これは、実装に依存しsigned char
またはunsigned char
ことができます。あなたはchar
がstd::numeric_limits<char>::is_signed
を使用して署名されているかどうかを確認することができます。
さて、私たちが知られている標準の葉その実装まで。
しかし、どのタイプをチェックするためには、このようなsigned
などunsigned
またはchar
、ありますか?
私はこれを行うには、マクロを書いてます:
#define IS_UNSIGNED(t) ((t)~1 > 0)
とgcc
、clang
、およびcl
でそれをテストします。しかし、私はそれは常に他のケースのために安全だと確信しません。