取非运算怎么算?

有点巧,突然收到这么一个问题?
~21 为什么的结果是 -22?

cout << ~21 << endl;
结果是:-22

我的回答:不是一个公式嘛?~x=-(x+1)(其实一直以来我也只知道这个公式)

突然这问原理给我整懵了,我也不知道咋解释,于是研究了一波。
下面是解释:

首先需要明确的一点是:
在计算机中,这些数都是以补码的形式存储在内存中的。
原码变反码:数的符号位不变,其它位均按位取反
非运算:连同数的符号位,所有位均按位取反

那么ok,计算"-21"
(int 有32位)
21的二进制是:
0000 0000 0000 0000 0000 0000 0001 0101

~21的二进制是:
1111 1111 1111 1111 1111 1111 1110 1010

cout << ~21 << endl; //这样子输出的是~21的十进制

1111 1111 1111 1111 1111 1111 1110 1010 (这个是补码)

要得到原码的十进制就需要转换。

原码变补码:取反加一
补码变原码:减一取反(符号位不取反)

减一:1111 1111 1111 1111 1111 1111 1110 1001
取反:1000 0000 0000 0000 0000 0000 0001 0110
即:结果为:-22

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值