我正在实现一个打印出位掩码的函数。我想一次按字节执行此操作。我遇到了一个我无法理解的奇怪的类型转换问题。
以下代码段打印256
char i = 128;
int j = 256;
printf("%u", (i & j));
而将i更改为int将返回0:
int i = 128;
int j = 256;
printf("%d", (i & j));
第一个奇怪行为的原因是什么?
答案 0 :(得分:2)
您的系统上似乎已(i & j)
已签名。这就是为什么当您执行0xFFFFFF80
&
时获得sign-extended
因此,128变为0x00000100
,因此在0xFFFFFF80
和00000000000000000000000100000000 // 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
。