(int)(unsigned char)(x)在C中做什么?

时间:2015-10-01 10:03:37

标签: c

ctype.h, line 20中,__ismask定义为:

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

(int)(unsigned char)(x)做什么?我猜它会将x强制转换为无符号字符(仅检索第一个字节而不管x),但是为什么它最终会转换为int

4 个答案:

答案 0 :(得分:11)

(unsigned char)(x)有效地计算unsigned char,其值为x % (UCHAR_MAX + 1)。这具有给出正值的效果(在0UCHAR_MAX之间)。大多数实现UCHAR_MAX的值都为255(尽管标准允许unsigned char支持更大的范围,但此类实现并不常见)。

由于(unsigned char)(x)的结果保证在int支持的范围内,转换为int不会改变价值。

净效应是最不重要的字节,具有正值。

当使用char(有符号或无符号)类型作为数组索引时,某些编译器会发出警告。转换为int会关闭编译器。

答案 1 :(得分:2)

由于unsigned char类型的环绕属性,对CHAR_BIT的强制转换可以安全地提取x的最不重要unsigned。 (如果char在平台上是char类型,则可能未定义强制转换为signed:溢出已签名类型是c)中未定义的行为。 CHAR_BIT通常是8。

转换为int然后转换为unsigned char。该标准保证int始终可以保留unsigned char可以承担的任何值。

更好的选择,如果您想要提取8个最低有效位,则应用& 0xFF并将该结果转换为unsigned类型。

答案 2 :(得分:2)

unsigned char - cast是为了确保该值在0..255范围内,然后将结果值用作_ctype数组中的一个255字节大的索引,请参阅ctype.h in Linux

答案 3 :(得分:0)

我认为char依赖于实现,signedunsigned。因此,您需要通过编写unsigned char来明确,以便不转换为负数。然后转为int