关于unsigned char的取反操作

 怎样才能正确进行 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

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值