int main()
{
char a = 0xA5;
int c = a;
printf("%dn", a);
int b = a >> 4 + 1;
printf("%dn", b);
return 0;
}
输出结果
输出结果为:
-91
-3
原因:0xA5的十进制结果是165。C语言编译器认为是将一个无符号数165存放在一个字节的字符变量a中,但实际上char是有符号的。所以165被当成有符号数对待,结果也就是-91(补码运算的结果)。-3的由来是负数右移运算的结果。
细品过程TIPS:
char的值范围可以是-128127或0225。
unsigned char的值范围是0~255。
首先将165十进制数转换为二进制数,结果如下:
1010 0101
对其进行补码运算,结果如下:
将正整数的二进制数的所有位取反码然后最低位加1,其结果就是该二进制所有位取1减去该正整数的结果。
正整数的补码为其转化为二进制后的本身,负整数的补码为其转化为二进制后所有位取反,然后加1。
0101 1011
TIPS:91+165的结果是256。
再下来说明左右移运算符。
左移运算符:丢弃高位,低位补0。
右移运算符:负数右移高位补1,无符号负数高位补0。
-91的二进制码:
0101 1011
其反码为:
1010 0101
将其右移5位,高位补1(+运算符的优先级高于>>)
1111 1101
将其取反补1,得到结果:
0000 0010
其十进制数为-3。



