char はデフォルトで署名付きですか?それとも署名なしですか?

StackOverflow https://stackoverflow.com/questions/2054939

  •  20-09-2019
  •  | 
  •  

質問

『Complete Reference of C』という本では次のように述べられています。 char デフォルトでは署名されていません。

しかし、私はこれを Visual Studio だけでなく GCC でも検証しようとしています。それは次のように捉えています 署名済み デフォルトでは。

どちらが正しいか?

役に立ちましたか?

解決

この本は間違っています。平野charは、符号付きまたは符号なしている場合、標準では指定しません。

charsigned char、及びunsigned char

実際には、標準は、3つの異なるタイプを定義します。あなたは#include <limits.h>、その後CHAR_MINを見れば、プレーンcharsignedunsignedであれば、あなたは見つけることができます(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ことができます。あなたはcharstd::numeric_limits<char>::is_signedを使用して署名されているかどうかを確認することができます。

さて、私たちが知られている標準の葉その実装まで。

しかし、どのタイプをチェックするためには、このようなsignedなどunsignedまたはchar、ありますか?

私はこれを行うには、マクロを書いてます:

#define IS_UNSIGNED(t) ((t)~1 > 0)

gccclang、およびclでそれをテストします。しかし、私はそれは常に他のケースのために安全だと確信しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top