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

p8h8hvxi  于 2023-04-05  发布在  其他
关注(0)|答案(4)|浏览(155)

在ctype.h第20行中,__ismask定义为:

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

(int)(unsigned char)(x)是做什么的?我猜它把x转换成unsigned char(只检索第一个字节,而不管x是什么),但为什么它在最后转换成int

zlhcx6iw

zlhcx6iw1#

(unsigned char)(x)有效地计算值为x % (UCHAR_MAX + 1)unsigned char。这具有给出非负值(在0UCHAR_MAX之间)的效果。在大多数实现中,UCHAR_MAX的值为255(尽管标准允许unsigned char支持更大的范围,但这种实现并不常见)。
由于(unsigned char)(x)的结果保证在int支持的范围内,因此转换为int不会更改值。
净效应是最低有效字节,具有正值。
一些编译器在使用char(有符号或无符号)类型作为数组索引时会给予警告。转换为int会关闭这些编译器。

qf9go6mv

qf9go6mv2#

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

qv7cva1a

qv7cva1a3#

由于unsigned类型的环绕属性,转换为unsigned char可以安全地提取x的最低有效位CHAR_BIT。(如果char在平台上是signed类型,则转换为char可能是未定义的:有符号类型溢出是c)中未定义的行为。CHAR_BIT通常是8。
转换为int后,将转换为unsigned char。标准保证int始终可以保存unsigned char可以接受的任何值。
如果你想提取8个最低有效位,一个更好的选择是应用& 0xFF并将结果转换为unsigned类型。

f3temu5u

f3temu5u4#

我认为char是依赖于实现的,要么是signed,要么是unsigned。所以你需要通过写unsigned char来显式化,以免转换为负数。然后转换为int

相关问题