15

charどうやら、プレーンはデフォルトで署名付きまたは署名なしのいずれかになる可能性があります。Stroustrup は次のように書いています。

プレーンな char が符号付きと見なされるか符号なしと見なされるかは、実装によって定義されます。これにより、いくつかの厄介な驚きと実装の依存関係の可能性が開かれます。

文字が署名されているか署名されていないかを確認するにはどうすればよいですか? intそれらを後で変換したいかもしれませんが、それらが負になることは望ましくありません。常にunsigned char明示的に使用する必要がありますか?

4

5 に答える 5

18

いくつかの代替案:

const bool char_is_signed = (char)-1 < 0;

#include <climits>
const bool char_is_signed = CHAR_MIN < 0;

charはい、一部のシステムは符号なしの型をプレーンにします。私が遭遇した例: Cray T90、Cray SV1、Cray T3E、SGI MIPS IRIX、IBM PowerPC AIX。また、EBCDIC を使用するシステムは、ほとんどの場合char、すべての基本文字が負でない値を持つようにプレーンな符号なしにする必要があります。(また、一部のコンパイラには、gccやcharなどの の署名を制御するオプションがあります。)-fsigned-char-funsigned-char

しかし、 Benjamin Lindley's answerstd::numeric_limits<char>::is_signedで示唆されているように、おそらく意図をより明確に表現しています。

(一方、私が提案した方法は C にも適用できます。)

于 2013-08-14T00:20:06.007 に答える
0

「常に」を使用すると、unsigned charいくつかの興味深い驚きが得られる可能性があります。printffopencharunsigned char

編集: C スタイル関数の「楽しみ」の例:

const unsigned char *cmd = "grep -r blah *.txt";
FILE *pf = popen(cmd, "r"); 

エラーが発生します(実際、行に対して1つ、*cmd =行に対して1つのエラーが発生しますpopen)。を使用const char *cmd = ...するとうまくいきます。私が選んだのは、いくつかの標準的なpopenC++ 機能と置き換えるのが簡単ではない関数であるためです。printffopeniostreamfstreamunsigned charchar

ただし、127 を超える文字に対して>またはを使用している場合は、使用する必要があります (または、下位 8 ビットにキャストしてマスクするなどの他の解決策を使用する必要があります)。直接の比較は避けたほうがよいでしょう (特に非 ASCII 文字の場合は、ロケールや文字エンコーディングなどに応じて複数のバリエーションが存在することが多いため、とにかく厄介です)。ただし、等しいかどうかの比較は機能するはずです。<unsigned charint

于 2013-08-14T00:23:56.833 に答える
-1

プリプロセッサ コマンドを使用できます。

 #define is_type_signed(my_type) (((my_type)-1) < 0)
于 2013-08-14T00:20:53.697 に答える