2015-10-01 15 views
6
ctype.h, line 20

__ismaskは次のように定義されています(int)(unsigned char)(x)はCで何をしますか?

#define __ismask(x) (_ctype[(int)(unsigned char)(x)]) 

(int)(unsigned char)(x)は何をしますか?私はそれがxに関係なく最初のバイトを取得するために、符号なしの文字にxをキャストすると思いますが、それはなぜ最後にintにキャストされますか?

+0

キャストto intは冗長です – sp2danny

答えて

11

(unsigned char)(x)は、x % (UCHAR_MAX + 1)の値を持つunsigned charを効果的に計算します。これは正の値(0UCHAR_MAXの間)を与えるという効果があります。ほとんどの実装では、UCHAR_MAXの値は255です(標準ではunsigned charがより広い範囲をサポートすることができますが、そのような実装は珍しい)。

(unsigned char)(x)の結果は、intでサポートされている範囲にあることが保証されているため、intへの変換は値を変更しません。

正味の効果は、正の値を持つ最下位バイトです。

char(signedまたはnot)タイプを配列インデックスとして使用すると、コンパイラによって警告が表示されることがあります。 intに変換するとコンパイラがシャットダウンします。

+1

これは答えです。厳密なスタイルガイドは、特定の暗黙的な変換(またはそのすべて)を禁止することがあります。とにかく整数の宣伝が何をしたのかを示すだけのキャストは存在します。 – Potatoswatter

+0

ありがとう、ありがとう。だから、それは 'int'にキャストする理由です。 –

0

私はcharが実装に依存していると考えます。signedまたはunsignedです。負の数値にキャストしないためには、unsigned charと明記する必要があります。その後、intにキャストします。 unsigned char

2

キャストは安全unsignedタイプの回り込み特性により、xの最下位CHAR_BIT Sを抽出します。 (charがプラットフォーム上のsignedタイプの場合、キャストはcharになる可能性があります.c)では、符号付きタイプのオーバーフローが未定義の動作です。 CHAR_BITは通常8です。

intへのキャストはunsigned charに変換されます。標準では、intは常にunsigned charの値を保持できることが保証されています。

8つの最下位ビットを抽出する場合は、& 0xFFを適用し、その結果をunsignedタイプにキャストすることをお勧めします。

+2

標準では、少なくとも '[0,255]'の範囲をサポートするには 'unsigned char'が必要です。より大きな最大値を持つ 'unsigned char'を提供する実装を妨げるものは何もありません。 – Peter

2

unsigned char -castは、値が0..255の範囲内にあることを確認することで、結果の値が_ctype配列のインデックスとして使用されます。この値は255バイトです。ctype.h in Linuxを参照してください。

+0

すべての答えをありがとう。しかし、私は 'unsigned char'が' _ctype'配列をカバーするのに十分な大きさであるときに 'int'にキャストすべきですか? –

関連する問題