unsigned char i=0x80;
printf(“0x%x\n”, ~i>>3+1);//无符号16进制输出
char ci=0x80;
printf(“0x%x\n”, ~ci>>3+1);
解析:
取反操作前,字符型数据会自动转成整形
即 i = 0x00000080
~i 为 0xffffff7f
~i>>3+1 由于+号运算符优先级比>>位移运算符高,所以 ~ i>>3+1等价于 ~i>>4,则得到0xfffffff7
ci变量也一样,先转换成整形,为0xffffff80(因为ci为有符号型字符变量,且符号位为1,转成整形时,高位补1)
之后同理
- 移位操作优先级最低, 所以都是右移4位, 取反优先级最高, 最先做
- 整形提升, uchar会提升到uint, 而char会提升到int, 所以0x80在uint中还是0x80, 而在int为0xffffff80, 它们取反的结果就不同了