昨天写了一个通信相关的编解码程序,被里面的一个小bug郁闷了半天。
看下面一段代码
#include <stdio.h>
#include <string.h>
int main()
{
char a = 9;
a += 0x0f;
if(a == 0x9f)
{
printf("yes/n");
}
return 0;
}
输出时竟然没有打印yes,而如果a以unsigned char 类型声明时就没有问题。
在网上查了一些资料,还是没有搞太明白。
其中一个比较靠谱的解释是在做“a == 0x09”判断时会a自动转换为(signed)int, 而在高位全部以’f‘补全,所以不相等。
我对补码一类的东西一向搞不清楚,这次也没想继续钻下去,但记住了一点:char和unsigned char 在用作普通字符操作时没有区别,但如果在进行数字运算时还是千万要注意,最好用unsigned char.