关于补码

作者: CodingTech | 来源:发表于2016-09-09 20:15 被阅读127次

今天讲补码的时候卡壳了,有点尴尬,太想当然了,向童鞋们道歉!在这里把补码的原理解释一遍。

先看8位的二进制的范围[00000000, 11111111],我们暂时只考虑真值,即这里面所有的数都表示数值,其对应的十进制数的范围为[0, 255],也就是说8位二进制数的模为256,如果把这个范围分为两部分[00000000, 01111111]和[10000000, 11111111],后面的这一部分是不是刚好可以表示负数的二进制补码呢?

我们看一个具体的例子,如果我们要表示-3,其二进制补码为:

(10000011) = (11111100) = (11111101)

如果只把-3的补码的编码当数值看(没有符号位),则(11111101)2 = 253,那-3和253是什么关系呢?

-3 + 256 = 253,也就是-3 = 253(mod 256)(注:如果这个不能理解,就假设钟表圆盘上有256个刻度,依次标为0,1, ..., 255,在任意一个时刻点,钟表顺时针拨253个刻度和逆时针拨3个刻度指向同一个刻度)

这下应该明白了。 从这个角度,也就可以解释5-3=5+(-3)=5+253 (mod 256) = 258 (mod 256) = 2(mod 256),用二进制补码运算时,将符号位能带入计算也是因为这个原因。

回到8位二进制范围[00000000, 11111111],如果用二进制补码表示带符号数,[00000000, 01111111]表示正数,[10000000, 11111111]表示负数,则(10000001) = -127, (10000010)=-126, ..., (11111111) = -1,那多出来的(10000000) = ? 显然,根据补码的定义,符号位为1,这应该是负数,从节约资源的角度,将其定义为-128最合适,这也就是为什么8位二进制补码的范围为[-128~127]的原因。

相关文章

  • 原码、反码、补码和移码

    书中关于原码、反码、补码和移码的定义如下(n是机器字长):原码: 反码: 补码: 移码: 原码, 反码, 补码的基...

  • 关于补码

    今天讲补码的时候卡壳了,有点尴尬,太想当然了,向童鞋们道歉!在这里把补码的原理解释一遍。 先看8位的二进制的范围[...

  • 计算机原码、反码、补码详解

    注:之前查找了关于原码、反码、补码的相关资料,张子秋的博客:原码, 反码, 补码 详解讲的比较透彻。为了方便,现将...

  • 补码:从符号位负权理解

    我所查看的绝大多数关于补码原理的资料都是从钟表原理、模数运算之类的开始讲起,让我觉得很混淆。所以关于补码的理解我打...

  • 关于2的补码

    1.负数在计算机中如何表示? 举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢? 可以将一个二进...

  • 汇编

    补码 在求补码 得真值

  • 关于补码_2019-03-29

    整数的补码正数的补码正数的补码等于源码负数的补码负数的补码:源码中符号位保持不变,其余各位取反后再加1 小数小数的...

  • 计算机的补码,老师误导人,白学了

    关于补码,大概率,你的老师也会这么讲:对于非负数,补码和原码一样,对于负数,符号位为 1,其余位是原码的反码再加 ...

  • Java 位运算超全面总结(以及Koltin)

    1.原码、反码、补码 关于原码、反码、补码的相关知识作者不打算在这里长篇大论,相关知识已有别的大佬总结很好了,还请...

  • 2018-10-22 Python31 原码、反码、补码

    原码、反码、补码 1)如何计算补码?规则: 正数:原码 = 反码 = 补码负数:反码 = 符号位不变,其他位取反补...

网友评论

  • _T丶:老师好啊,写的潜显易懂。我是学软件的
  • 1b16793e79ca:啊啊啊老师!粉您!!!
    CodingTech:@Lucia123
    备课太想当然了,向童鞋们道歉!!!

本文标题:关于补码

本文链接:https://www.haomeiwen.com/subject/qcgeettx.html