二进制取反问题

来源:2-8 二进制的介绍

慕码人2111558

2020-02-17 15:36:37

我想问下取反是一定会得到一个负数吗?视频中说是以取反后的二进制数的左边第一个数是0还是1为依据判断是否为正或负数,但我用28即11100取反后应为00011这时不是应该是个正数吗?应该就为3啊,但是是得到了-29,所以想问下取反后左边第一个数为0时,怎么算呢?

写回答

2回答

zhima123

2020-02-17

建议了解下计算机的原码,反码,和补码概念以及负数的二进制表示方法,了解后,将会很好理解这个问题。

  1.  位是数据存储的最小单位,其中8 bit 就称为一个字节(Byte)。计算机中的CPU位数指的是CPU一次能处理的最大位数。所以28转化后为0001 1100

  2. 在计算机系统中,数值一律用补码来表示和存储。正数的补码和原码一样,负数则比较复杂:

    原码:为十进制绝对值转化为二进制后最高位取1

    反码:原码的最高位不变,其他位数取反

    补码:反码加1

    那么: 补码 = - (原码+1),按顺序理解为:

              0001 1100(28的二进制)

    取反后1110 0011(现在为补码)

              1001 1100  (转为反码)

              1001 1101(要求的原码,转为二进制即为-29)

1

好帮手乔木

2020-02-17

同学你好:

python的位运算符是基于其数值化为二进制的0或1,通常1字节后再进行的运算,1字节为八位二进制。

所以28的二进制为00011100

取反                     11100011

符号位为1,表示负数,负数是以补码存储的,需要转换为原码,因此除去符号位需要再取反加1。

除去取反              10011100

加一                     10011101

--------------------------------------

                            -           29

如果我解决了同学的问题,请采纳!学习愉快^_^。

2

0 学习 · 8160 问题

查看课程