在ctype.h, line 20中,__ismask
定义为:
#define __ismask(x) (_ctype[(int)(unsigned char)(x)])
(int)(unsigned char)(x)
做什么?我猜它会将x
强制转换为无符号字符(仅检索第一个字节而不管x
),但是为什么它最终会转换为int
?
答案 0 :(得分:11)
(unsigned char)(x)
有效地计算unsigned char
,其值为x % (UCHAR_MAX + 1)
。这具有给出正值的效果(在0
和UCHAR_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
依赖于实现,signed
或unsigned
。因此,您需要通过编写unsigned char
来明确,以便不转换为负数。然后转为int
。