按位运算中的char转换

时间:2016-03-24 18:43:03

标签: c casting bitwise-operators

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

以下代码段打印256

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

而将i更改为int将返回0:

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

第一个奇怪行为的原因是什么?

2 个答案:

答案 0 :(得分:2)

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

时,128转化为&时获得sign-extended

因此,128变为0x00000100,因此在0xFFFFFF8000000000000000000000000100000000 // 256 11111111111111111111111110000000 // 128, sign-extended 执行int

i

当您在unsigned char上执行相同操作时,不会执行任何符号扩展,因此您会按预期获得零。

要避免此行为,请指定unsigned char i = 128; int j = 256; printf("%u", (i & j)); 应为.m

mymax.m

这会产生零(demo)。

答案 1 :(得分:1)

int是一个已签名的值,当您& j时,它会被char符号扩展为int