【十二】凭什么二进制负数是正数的取反加1?

        都知道在有符号的数字中,最高位为符号位,那么这个符号位究竟是什么意思呢?简单的负号吗?

        在有符号的数字中,最高位就代表该数的负数。

        为了方便我这儿拿八位数字举例,10000000就是代表负128

        ok,知道了这一点之后,对于负数的二进制理解就很容易了

        例如,-27(这里还是以八位有符号数字举例哈),就应该是(-128)+(128-27)

        因为八位有符号数字不能表示128,所以我们写成(-128)+(127-27+1)

        我们先来算127-27

        二进制表示为01111111-00011011

        很显然,就相当于后七位取反,即为01100100

        加上-128即为第一位加个1:11100100

        把最后那个一加上即为11100101

        所以最后看起来的形式就像是:

        1:正数的二进制取反((-128)+(127-27))

        2:加一((-128)+(127-27+1))

【小补充一下】

        那么如果在c中利用位运算的话怎么做呢

        还是例如八位,这里设一个x为正数

        1: x ^ 01111111 = y                        (x ^ 127 = y)

        2: y & 00000001 = z                      (y & 1 = z)

        3: z & 10000000 = result               (z & -128 = result)

【再补充一下】

        这样做还有个好处就是方便数字的扩展

        举个例子,咱这边有个八位的有符号数,对于正数的扩展是很简单的,只需要在其前面加0就好了

        但是对于负数,比如说(-128+x)(看了前面的应该知道我为什么这样表示)

        如果想要扩展一位,那么最高位补上符号位1,该数字就变成了(-256+128+x)(因为增加一位,所以-128变成了128)即为(-128+x)我们就在不改变其值的基础上扩展了它的位数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值