【分享】弄懂为何1取反得到-2

C++中整数补码取反操作详解

弄懂这个只需要知道两点即可:

1.在计算机中存储数据的方式大多是用补码,我们在计算机上进行的取反操作多是针对补码进行取反【是的在 C++ 中,几乎所有的有符号整数类型(如 shortintlonglong longchar、以及来自 <cstdint> 的固定宽度整数类型)都采用补码表示。这种表示方式在计算机中的处理和计算上非常高效,因此成为了主流的整数表示方式。】

2.源码、反码、补码的基本特性和关系【讲一下补码:

在计算机内部,整数是以二进制形式存储的。对于有符号整数:

  • 正数用补码表示与其绝对值相同。
  • 负数需要用补码来表示,而计算补码的方法是:对符号的绝对值的二进制数取反,然后加1。

举个例子:

一:看清x=5和x=-5在计算机中的存储数据:

int 5 在计算机的存储形式是:

00000000000000000000000000000101,会二进制的同学直接可以看出是5。

int -5在计算机的存储形式是:

11111111111111111111111111111011

步骤一:需要先在保留符号位的情况下取反得到:

10000000000000000000000000000100(最左边是符号位,0代表+,1代表-)

步骤二:得到的结果+1

10000000000000000000000000000101(最左边是符号位,0代表+,1代表-)等于-5

二:认知实际上我们在计算机上做的取反操作

int x=5,对x取反x=~x实际上:

00000000000000000000000000000101(这是5的补码:回忆,正数用补码表示与其绝对值相同)

取反得到:

11111111111111111111111111111010(这还是补码,但因为取反的结果,最左边的符号位为1,所以是负数的补码:回忆,负数需要用补码来表示,而计算补码的方法是:对符号的绝对值的二进制数取反,然后加1。)

步骤一:需要先在保留符号位的情况下取反得到:

10000000000000000000000000000101(最左边是符号位,0代表+,1代表-)

步骤二:得到的结果+1

10000000000000000000000000000110(最左边是符号位,0代表+,1代表-)等于-6

所以看懂上面这个例子后,1取反得到-2你应该能理解了吧。不理解继续再看下面


int 1在计算机内存储的形式是补码,为:

00000000000000000000000000000001

取反后得:

11111111111111111111111111111110(但因为取反的结果,最左边的符号位为1,所以是负数的补码:回忆,负数需要用补码来表示,而计算补码的方法是:对符号的绝对值的二进制数取反,然后加1。)

步骤一:需要先在保留符号位的情况下取反得到:

10000000000000000000000000000001(最左边是符号位,0代表+,1代表-)

步骤二:得到的结果+1

10000000000000000000000000000010(最左边是符号位,0代表+,1代表-)等于-2

记住,存储形式是补码、补码、补码,在负数的情况下是需要转换步骤的。

加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值