怎样才能正确进行 unsigned char取反操作?
int main()
{
unsigned char a=0xA5;
int b=~a>>5;
printf("%d\n",b);
}
错误思路:
将0xA5写入内存中的形式为:
原码:00000000 00000000 00000000 1010 0101
因为是正数,所以原码,反码,补码相等;
unsigned char占一个字节,即8bit,a- 10100101
按照常规来说,将a取反为:0101 1010
然后再右移动5个为:0000 0010
结果为2。
但是这里特别要注意一点,低于int类型(即规定的寄存器大小)的基础类型需要在运算过程中转化为int类型(寄存器的位数)的大小进行计算,然后在运算完成以后再截取成原大小进行结果的表示;
正确思路:
将0xA5写入内存中的形式为:
原码:00000000 00000000 00000000 1010 0101
因为是正数,所以原码,反码,补码相等;
unsigned char占一个字节,即8bit,a- 10100101
在16bit的寄存器中转化为:0000 0000 1010 0101
全部取反得到 1111 1111 0101 1010
而后右向移动5个,左边补0: 0000 0111 1111 1010
运算完成,开始从右边截取出unsigned char对应位数的值: 1111 1010
因为以%d形式打印,要先进行整形提升,由于是unsigned型不用考虑符号位直接补0:
00000000 00000000 00000000 11111010
该数值为内存中对应数字的补码形式,但是由于是unsigned型,所以原码,反码,补码相同,转化为十进制为250