、__ismask
は次のように定義されています(int)(unsigned char)(x)はCで何をしますか?
#define __ismask(x) (_ctype[(int)(unsigned char)(x)])
(int)(unsigned char)(x)
は何をしますか?私はそれがx
に関係なく最初のバイトを取得するために、符号なしの文字にx
をキャストすると思いますが、それはなぜ最後にint
にキャストされますか?
、__ismask
は次のように定義されています(int)(unsigned char)(x)はCで何をしますか?
#define __ismask(x) (_ctype[(int)(unsigned char)(x)])
(int)(unsigned char)(x)
は何をしますか?私はそれがx
に関係なく最初のバイトを取得するために、符号なしの文字にx
をキャストすると思いますが、それはなぜ最後にint
にキャストされますか?
(unsigned char)(x)
は、x % (UCHAR_MAX + 1)
の値を持つunsigned char
を効果的に計算します。これは正の値(0
とUCHAR_MAX
の間)を与えるという効果があります。ほとんどの実装では、UCHAR_MAX
の値は255
です(標準ではunsigned char
がより広い範囲をサポートすることができますが、そのような実装は珍しい)。
(unsigned char)(x)
の結果は、int
でサポートされている範囲にあることが保証されているため、int
への変換は値を変更しません。
正味の効果は、正の値を持つ最下位バイトです。
char
(signedまたはnot)タイプを配列インデックスとして使用すると、コンパイラによって警告が表示されることがあります。 int
に変換するとコンパイラがシャットダウンします。
これは答えです。厳密なスタイルガイドは、特定の暗黙的な変換(またはそのすべて)を禁止することがあります。とにかく整数の宣伝が何をしたのかを示すだけのキャストは存在します。 – Potatoswatter
ありがとう、ありがとう。だから、それは 'int'にキャストする理由です。 –
私はchar
が実装に依存していると考えます。signed
またはunsigned
です。負の数値にキャストしないためには、unsigned char
と明記する必要があります。その後、int
にキャストします。 unsigned char
に
キャストは安全unsigned
タイプの回り込み特性により、x
の最下位CHAR_BIT
Sを抽出します。 (char
がプラットフォーム上のsigned
タイプの場合、キャストはchar
になる可能性があります.c)では、符号付きタイプのオーバーフローが未定義の動作です。 CHAR_BIT
は通常8です。
int
へのキャストはunsigned char
に変換されます。標準では、int
は常にunsigned char
の値を保持できることが保証されています。
8つの最下位ビットを抽出する場合は、& 0xFF
を適用し、その結果をunsigned
タイプにキャストすることをお勧めします。
標準では、少なくとも '[0,255]'の範囲をサポートするには 'unsigned char'が必要です。より大きな最大値を持つ 'unsigned char'を提供する実装を妨げるものは何もありません。 – Peter
unsigned char
-castは、値が0..255の範囲内にあることを確認することで、結果の値が_ctype
配列のインデックスとして使用されます。この値は255バイトです。ctype.h in Linuxを参照してください。
すべての答えをありがとう。しかし、私は 'unsigned char'が' _ctype'配列をカバーするのに十分な大きさであるときに 'int'にキャストすべきですか? –
キャストto intは冗長です – sp2danny