按位运算中的字符转换

char conversion in bitwise operations

我正在实现一个打印位掩码的函数。我想一次按字节执行此操作。我遇到了一个我无法理解的奇怪的类型转换问题。

以下代码片段打印 256

char i = 128;
int j = 256;
printf("%u", (i & j));

而将 i 更改为 int returns 0:

int i = 128;
int j = 256;
printf("%d", (i & j));

是什么导致了第一个的奇怪行为?

char i=128 是一个 符号 值,当你 & 它与 j.

char 似乎已在您的系统上签名。这就是为什么当您执行 (i & j)

时 128 在转换为 int 时得到 sign-extended

因此128变成了0xFFFFFF80,所以&0x00000100进行了0xFFFFFF80:

00000000000000000000000100000000 // 256
11111111111111111111111110000000 // 128, sign-extended

当您对 int 执行相同的操作时,没有执行符号扩展,因此您得到了预期的零。

要避免此行为,请指定 i 应该是 unsigned char:

unsigned char i = 128;
int j = 256;
printf("%u", (i & j));

这会产生零 (demo)。