精华内容
下载资源
问答
  • 为什么需要补码 在真实世界里,常常需要负数。如果存储在存储设备中的最小值为0,那么计算机如何存储负数呢?这个问题不是存储问题,而是程序设计人员的解释问题,类似这样的问题在后边的存储设备中也存在( 关注下一篇...

    为什么需要补码
    在真实世界里,常常需要负数。如果存储在存储设备中的最小值为0,那么计算机如何存储负数呢?这个问题不是存储问题,而是程序设计人员的解释问题,类似这样的问题在后边的存储设备中也存在( 关注下一篇)
    百科概念
    计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
    在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
    从百科解释来看是为了减少硬件电路设计,这是最终目的。从设计目的来看实在感慨设计师的巧妙。
    下面我们分析一下,为什么原码取反加一就能够减少硬件电路,换句话说,为什么取反加一就可以将减法转化为加法?
    定义和原理
    从百科来看,给补码下个定义比较困难,就好比解释什么是筷子一样。我们可以抛开计算机,从人类社会数学的概念出发,给补码定义如下:
    所谓补码就是某个数n,这个数加上-n=0。这也是补码的基本原理。
    我们将二进制的首位为0解释为正数,1解释为负数

    补码.jpg

    13 00001101
    -13 11110011(补码)

    1 00000000
    

    直接从以上等式来看,13和-13之间除了符号位不一样,其实位之间并无关系。而实际上他们之间的关系十分微妙。
    这里可能有人会想,为什么不直接将符号位取反即表示负数?比如+13(+一般省略)和-13在十进制中就是符号不一样。
    理论上单纯从解释的角度出发没有问题
    00001101 (+13)
    10001101 (-13)

    但无法将该种解释通过加法来实现减法.(因为二进制相加之后不为0)
    那么这种微妙的关系是什么呢?
    通过补码的定义
    n+(-n)=0
    这里的(-n)即为补码.我们反推过来,这里n已知,0已知(00000000).
    如何求-n?
    我们知道给定一个数n,让这个数变为0有两种办法

    做减法,将这个数的每一位减1,这个办法在百科的概念中可以被否决,因为要增加硬件成本.
    做加法,让结果溢出后即为0

    根据第二种办法我们得出
    最大的数+1即可溢出为0
    那么n+(-n)=0 成立,-n推导如下
    已知
    0=(11111111+1)

    11111111
    1

    1 00000000
    =>

    n+(-n)=(11111111+1)
    已知
    n|~n=11111111
    n+(-n)=(n|~n)+1
    n+(-n)=(n+~n)+1(二进制按位或即按位相加)
    =>
    (-n)=~n+1 (等号两个n抵消)

    总结
    通过以上分析,真的感慨计算机大师的微妙设计。
    通过数学的巧妙设计使cpu中不需要减法器电路以减少设计成本。

    作者:zh_harry
    链接:https://www.jianshu.com/p/f774a73a06ad
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • 二进制补码为什么是原码取反加一

    千次阅读 2020-03-23 20:37:09
    二进制补码为什么是原码取反加一、补码,反码。

    一.二进制和原码的定义

    二进制

    在二进制数中,每一位仅有01两个可能的数码。所以计数基数为2。低位和相邻高位间的进位关系是“逢二进一”。

    原码

    为了表示数的在二进制数的前面增加一位符号位。符号位为0表示这个数为正数,符号位为1表示这个数为负数。这种形式的数称为原码。

    二.反码和补码的形式

    反码

    正数反码是其本身,负数反码是将其原码除符号位,其余各位取反(0变1,1变0)。

    补码

    正数补码是其本身,负数补码是在其反码最后一位加1

    三.补码为什么是原码取反加一

    补码的出现

    当我们使用二进制原码进行相反数的加法运算如:1+(-1)时
    alt
    得到的结果为-2。显然这个结果是错误的。为了解决这个问题出现了补码。

    补码的原理

    我们知道当一个二进制数的位宽确定后那么它所能表示的数也就具有了范围。基于这个原理为了实现相反数相加结果为0,我们可以使相反数相加的结果溢出从而成为0。
    在这里插入图片描述
    在这里插入图片描述
    如上图,假设还是1+(-1)= 0,二进制数位宽为4位。通过计算可以得出-1应表示为1111。我们将1111称为4位二进制数-1的补码。
    其中10000等于24。通过分析可以得出负数n的补码为2n-|n|。

    反码的确定

    一个数与其取反相加即可得到该数对应位宽的最大二进制数。
    在这里插入图片描述
    观察发现一个负数的反码就等于它的原码除符号位,其余各位取反+1。
    同时为了在补码的计算过程中不出现加法计算所以将一个负数的原码除符号位,其余各位取反得到的数称为它的反码。

    四.总结

    当我们初次读到“二进制补码等于原码取反加一。”这句话时我们会下意识的产生一种反码产生于补码前的错觉。但是事实上在数制的发展思路中补码应该先于反码出现,甚至于我们可以理解为,为了补码在计算机中的计算方便所以产生了反码。

    强调:

    1.理解思路应该是补码先于反码。
    2.反码加一产生补码只是一种数字组合中的巧合,其本身并不重要,关键要理解补码的原理。
    3.反码变补码的+1是指在最后一位加一,不是加到个位。

    展开全文
  • 首先先理解这句话的意思,“(1)补码的(2)补码就是原码”,其中第一个标注的"补码",就是名词补码,而第个标注的"补码",是个代称,含义就是取反加一,这句话完整的意思是一个数的补码取反加一后就还原成原码了 ...

    首先先理解这句话的意思,“(1)补码的(2)补码就是原码”,其中第一个标注的"补码",就是名词补码,而第二个标注的"补码",是个代称,含义就是取反加一,这句话完整的意思是一个数的补码,取反加一后就还原成原码了

    一般来说,补码就是原码取反加一,还原成原码的时候应该先减去一再取反。其实在二进制里,"减一取反"和"取反加一"等价,所以我们可以这么做

    为什么等价呢?

    假设一个N位的二进制数,可表示的最大值是2^N - 1,例如八位二进制数,最大值是"11111111",就是2^8 - 1,另设一个数n,有一个数x,在这个N位的二进制数里,x = 2^N - 1 - n,即n + x = 2^N - 1,我们不妨称x为n的“补数”,那么对n取反,其实就是算出它对于当前N位数的最大二进制数的补数(因为一个位的数和自身取反的数相加必然是1),例如n是10110100(忽略符号位),取反后为01001011,此为x,而n+x=11111111,即当前N位数的最大二进制数,所以取反就是算补数。

    那么对于数n,先取反求出补数,(2^N - 1 - n),再加一得: (2^N - n)

    然后再先对n减一,得(n - 1), 再求补数:(2^N - 1 - (n - 1))= (2^N - n)

    所以说二进制里,"减一取反"和"取反加一"等价,补码减一取反或者取反加一的值都一样,都能求出原码

     

    展开全文
  • 补码为什么取反加一

    2020-03-14 17:19:25
    这篇文章转载于别人的博客,从本质上解释了为什么补码取反加一。我正好也在思考这个问题,看了这篇文章后豁然开朗,不得不佩服授人以渔的思考牛人。 原文地址 补码为什么取反加一 补码为什么取反加一 首先,阅读这...

    这篇文章转载于别人的博客,从本质上解释了为什么补码要取反加一。我正好也在思考这个问题,看了这篇文章后豁然开朗,不得不佩服授人以渔的思考牛人。

    原文地址
    补码为什么取反加一

    补码为什么取反加一

    首先,阅读这篇文章的你,肯定是一个在网上已经纠结了很久的读者,因为你查阅了所有你能查到的资料,然后他们都会很耐心的告诉你,补码:就是按位取反,然后加一。准确无误,毫无破绽。但是,你搜遍了所有俯拾即是而且准确无误的答案,却仍然选择来看这篇毫不起眼的文章,原因只有一个,只因为你还没有得到你想要的东西。

    因为你想要的,不是1+1=2,而是,1+1为什么等于2。当然,我们不讨论1+1的问题。我们讨论的,是补码。

    你已经困惑了很久,你明明知道补码就是按位取反,然后加一,但是你想知道的,不是它怎么求滴,而是,它怎来滴。当然,对于阅读这篇文章的你,既然想要知道这个答案,一定是有一定编程基础的读者,肯定知道补码与有符号数与无符号数的关系(有符号数指带有正负号的数,无符号可以理解为只大于0的数),你所查阅的所有资料首先都会用一个8位的二进制数给你举例,ok,我们也用一个8位的二进制数。

    8位二进制数,最小00000000,最大数11111111,换算十进制为0~ 255,当然,所有的参考资料都会这样讲,而且这也不是你想要的,但我们必须说下去。1~ 255,一共255的字符,再加上最前面的0,一共256个字符。现在,我们要用一个8位二进制数字来表示一个负数,可是二进制里没有负号,谁都知道二进制里只有0,1,再无其他符号。那么所以我们必须用一种方式来代替正负,也就是我们规定,当然是人规定的,而不是电脑,我们规定这个8位的二进制数的最前面一位数来表示这个数的正负,0代表是正,1代表是负。那么当第一位是0时,我们一共可以表示00000000~ 01111111这么多正数,因为第一位必须是0来代表正数;当第一位是1时,我们一共可以表示10000000~ 11111111这么多负数,然后,我们用00000000~ 01111111来代表0~ 127,那岂不是10000000~11111111代表 -0 ~ -127??可是网上都说不能有负0,可是我觉的没什么不妥啊,负0不还是0 吗?10-0=10,不就是相当于10+(-0)=10吗,现在我们不讨论正负0的问题,我们来讨论一个小学生的问题。

    我们现在要把00000000~11111111分成两组数,一组是正数,另一组是负数,正数是0,1,2,3,4,5,6,7,8,… 负数是 -1,-2,-3,-4,-5,-6,-7,-8,… 那么这里就有一个小学问题,那就是1+(-1)肯定要等于0,2+(-2)=0,他们是相反数,相加等于0,小学生都会。后面都是一样,那么现在我们使用上面的编码的方式进行一个计算,现在上面的编码中 1 对应的二进制是00000001,-1对应的二进制是10000001,然后你把这俩二进制数加起来,看看等于几,对,答案是10000010,不是00000000,也不是10000000, 10000010在上面的编码中代表 -2,00000000和10000000都在上面代表0,可是结果并不是他们。而00000001与10000001分别对应着1和-1,加起来理论的结果应该是0才对,也就是说上面的编码是错误的。

    或许接下来很多资料又讨论了反码,但是我们不,我们来求一个一元一次函数,一个小学的函数,1+x=0,求x=?,答:-1。没错,而且准确无误。那么现在问题来了,前面的正数编码应该是没有错的,00000000代表0, 00000001代表1,这些都符合我们的习惯,那么出错的是在后面的负数编码上,我们到底该如何编码对应负数编码它才能正确呢,因为我们知道1+(-1)必须等于0,也就是他们对应的二进制相加也必须等于0,1对应00000001,那么00000001+x=00000000,里面的x就应该代替 -1的二进制编码才对,这样,我们得到 x=11111111,大家看一下这和按位取反,然后加一的结果一样吗。

    所以我们的结论是,一个正数对应的负数(也就是俩相反数),这两个数的二进制编码加起来必须等于0才对,所以我们只要知道其中一个数的编码x,然后用0-x就是他对应的数的编码,这样的话,从0~127,我们用(0 - 其中一个二进制数的编码)=(另一个二进制数的编码),例如 2 的二进制编码是00000010,那么-2 的二进制编码就是0 - 00000010=11111110,因为他就应该这样,因为它就是一个小学问题,他俩加起来就应该等于0。那么1000000对应的编码是多少呢,当然也必须满足加起来等于0才行,那么10000000+x=0,求解x,答x=10000000,还是它本身,也就是在00000000~11111111这个范围里所有的二进制数都无法满足它,也就是没有一个数加上它等于0,但是两个数要有对应的编码,就必须加起来等于0才行,其实不止它没有,0也没有,0+x=0,那么x=0,也是它本身,既然这样了,那么也没有办法了,无可奈何只能做单身汉了,然后我们规定,既然10000000第一位是1,代表负数,那么我们规定它是一个负数,那么10000000就代替了-128,而且,它只自己一个人,也就是只有-128,没有正数128。

    然后,他们每个数都有了自己对应的编码,而且准确无误。1~ 127对应-1~ -127,再加上两个单身汉0和-128。然后呢,不知道谁起的名字,就把这种编码叫做了补码,如果你乐意,你也可以给它起个名字。但是呢,还有一个问题,为什么补码的求法是按位取反再加一呢,其实当你不明白为什么各大书籍都要用按位取反来计算补码的时候,我们完全可以直接用0减去它就得到他相反数的二进制编码了,譬如随便一个十六进制数 6C ,那么我们可以直接0-6C就得到他的相反数的补码了,结果为十六进制的94,跟按位取反再加一的效果一样。

    现在我们知道补码是怎么来的了,也就是为了保证两个相反数对应二进制的和必须是0,然后又不知道谁给它起了补码这个名字。补码补码,有没有感觉两个相反数是互补的呢,也就是任意两个相反数加起来一定等0,其中一个数变大,另一个就一定会变小互补保证结果为0。但是你肯定还在纠结,为啥要按位取反,为啥还要加一呢。其实,这涉及到一个二进制减法的问题,你既然知道补码这个概念,就一定会知道有进位丢失这么个东西。现在我们知道了补码是怎么来的,也就是(00000000 - 其中一个正数的补码)=(这个数相反数的补码),那么我们知道了1的二进制是00000001,那么我们来求-1的补码,也就是应该00000000 - 00000001=?,我们该怎么计算这个二进制减法呢,而且还是一个小数减去大数,连借位都没地方借,前面我们提到进位丢失这个东西,那么我们来计算一个算式,11111111+00000001=?知道进位丢失的你,肯定知道加起来后等于00000000,虽然结果应该是100000000(后面是8个0),但是只能有8位,所以最高位的1丢失了,那么现在好了,也就是说,我们可以把00000000看做(11111111+00000001)因为他俩是相等的,我们已经计算过的了,那么我们现在就可以把前面讲的公式中的00000000换成(11111111+00000001),也就是我们要计算-1的补码,我们就0-1的编码,也就是00000000-00000001,也就是(11111111+00000001)-00000001=(-1的补码),这个算式我觉的你应该会计算了,大数减小数,到现在,或许你现在已经发现什么了,是的,你发现了之前一直迷惑你的一个东西,“按位取反再加一”,但是可能还有一点迷惑,我们继续,因为我们每次都是用一个0减去一个数的补码来得到另一个数的补码,也就是里面的(11111111+00000001)是不变的,因为它就是0,那么我们现在要求一个数的补码,就是(11111111+00000001)- 一个数的补码=它相反数的补码,咱们把括号去掉,也就是11111111 - 一个数的补码+00000001=它相反数的补码,这是加法交换法则,只是把位置交换一下,小学生都会的,然后呢再加个括号方便我们理解,也就是(1111111 - 一个数的补码)+00000001=它相反数的补码。好了,问题来了,(11111111 - 一个数的补码)的结果是什么,这个你心里应该是清楚的,你也可以算一下,它正好的等于它的反码,也就是按位取反的一个数,其实也好理解,你减几个数就看见规律了,描述好麻烦,现在好了,也就是(11111111 - 一个数的补码)=这个数的反码,也就是(11111111 - 一个数的补码)=把这个数按位取反,到现在,你应该你已经很清楚他是怎么来的了。

    那么我们现在就可以把公式写成这样,(11111111 - 一个数的补码)+00000001=它相反数的补码,现在我们知道了(11111111 - 一个数的补码)=把这个数按位取反,然后把公式里的(11111111 - 一个数的补码)换成 “按位取反”,也就是(按位取反)+000000001=它相反数的补码,现在,按位取反,再加一,就终于出来了,这就是各大书籍资料所讲的,补码=按位取反+1…。好了,真相大白。

    原码,反码和补码
    国内教材一般会将原码,反码和补码的关系联系的比较紧密,但其实原码和补码,反码的关系并不大,倒是反码与补码有一些关系。关于原码,反码,补码的概念和关系,下面这篇链接解释的比较好。

    从计算机为什么用补码存储数据,衍生到存储单元数据溢出

    展开全文
  • 文章目录问题点概括具体处理流程1、判断高位是否12、转为二进制3、取反+14、转回16进制或10进制整体DemoTHE END 问题点概括        在做3D智慧城市大数据数字孪生系统时,...
  • C语言中二进制补码过程中取反后再加1,那个1是怎么加的?跪求!以下文字资料是由(历史新知网www.lishixinzhi.com)小编大家搜集整理后发布的内容,让我们赶快一起来看一下吧!C语言中二进制补码过程中取反后再...
  • 展开全部可以使符号位能与有效值部分一起参加运算32313133353236313431303231363533e58685e5aeb931333431373934,从而简化运算规则。...得到补码,使负数成为可加的正数。因此,负数的补码=模块...
  • 补码取反加一

    千次阅读 2020-10-19 14:30:21
    负数的表示 — 补码
  • 今天一场技术笔试一道编程题难住了我,算出一个十进制数的二进制补码和对应的16进制,由于时间紧张,加上紧张,做的极差,因此mark以下
  • 计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,”正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过是我们绝大多数人生来具有10个手指头这个解剖学事实的结果。尽管在历史上...
  • 二进制补码计算原理

    2021-03-11 08:29:04
    二进制的负数在计算机中采用补码的方式表示。很多人很好奇为什么使用补码,直接使用原码表示多好,看上去更加直观和易于计算。然而事实告诉我们,这种直观只是我们人类的一厢情愿罢了,在计算机看来,补码才是它们最...
  • 转载:http://blog.xdnice.com/blog40543i59178.htmlmatlab提供了一个系统函数dec2bin,可以用来进行十进制数的二进制转换,不过功能有限!在matlab中键入 help dec2bin,如下:DEC2BIN Convert decimal integer to a ...
  • java基础 二进制补码

    2021-02-12 23:25:41
    二进制补码:1、计算机系统的内部以二进制形式存储数据。2、在Java程序中输入的十进制的数据都会被自动转换二进制,Java内部也以二进制来进行数值运算,但返回的结果是十进制。二进制补码的原理:正数+负数=模。模...
  • 二进制补码以及为什么要使用补码

    千次阅读 2016-02-19 15:54:18
    2、在Java程序中输入的十进制的数据都会被自动转换为二进制,Java内部也以二进制来进行数值运算,但返回的结果是十进制。补码规则1、在计算机系统中,数值一律用二进制补码来存储。 2、二进制的最高位是符号位,0...
  • 二进制补码运算

    千次阅读 多人点赞 2020-07-23 13:52:43
    二进制负数的在计算机中采用补码的方式表示。很多人很好奇为什么使用补码,直接使用原码表示多好,看上去更加直观和易于计算。然而事实告诉我们,这种直观只是我们人类的一厢情愿罢了,在计算机看来,补码才是它们最...
  • java二进制正数和负数取反

    千次阅读 2019-05-16 10:22:49
    “反码”,“取反”,“按位取反(~)”,这3个概念是不一样的。 取反:0变1,1变0 反码:正数的反码是其本身,对于负数其符号位...要弄懂这个运算符的计算方法,首先必须明白二进制数在内存中的存放形式,二进制数...
  • 本文目录反码和补码存在的意义为什么负数的补码是原码按位取反加一?解释参考文献 反码和补码存在的意义 反码:解决负数加法运算问题,将减法运算转换为加法运算,从而简化运算规则; 补码:解决负数加法运算正负零...
  • 如果知道二进制补码、十六进制或十进制其中一个,需要转换出其它形式,那么也是很简单的。 对于二进制和十六进制直接转换(技巧在于记住1~15的二进制、十六进制转换关系表,熟练于心) 对于无符号数(正数)来说...
  • 那么,为什么计算机使用补码比原码更好,又是如何通过补码来计算数值的呢?这其中的原理是什么? 什么是补码补码的定义:正数的补码与原码相同。负数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位...
  • 二进制补码计算原理详解

    万次阅读 多人点赞 2018-07-03 17:34:54
    二进制负数的在计算机中采用补码的方式表示。很多人很好奇为什么使用补码,直接使用原码表示多好,看上去更加直观和易于计算。然而事实告诉我们,这种直观只是我们人类的一厢情愿罢了,在计算机看来,补码才是它们最...
  • 今天看了《逻辑设计基础》才明白了为什么二进制负数的补码是符号位不变,其他位取反加一 1. 什么是补码补码:计算机是用来将减法转换成加法的一种手段,在计算机系统中,数值一律用补码来表示和存储。 2. 如何...
  • 补码是因为在计算机无法直接表示负数才所诞生的,也就是说不是为了求负数的补码才有的补码,而是为了在计算计中表示负数才有的补码。 --------------------------------------------------------------------------...
  • 为什么负数的补码取反加一

    千次阅读 2020-07-03 13:27:29
    所谓反码就是数的二进制表示取反加一 以Integer的【-1】例(Integer占4个字节,占用(4*8=32)位,第一位符号位): 【-1】的正常二进制表示【1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1...
  • 输出二进制补码

    2020-07-18 13:32:09
    输入一个整型(int)的整数,输出它的32位二进制补码。 输入 一个整型整数。 输出 输出一行,即该整数的补码表示。 样例输入 7 样例输出 00000000000000000000000000000111 知点 第一位符号位,0表示正数,1表示负数...
  • -128的二进制补码为什么是10000000?

    千次阅读 2019-11-04 23:13:26
    10000000表示-128的补码,你...补码运算规则:正数原码本身,负数符号位不变,原码取反加一。 127正数,其补码为原码0111 1111 -127负数,其补码为原码1111 1111, 符号位不变,原码取反1000 0000, 加一...
  • Java二进制补码示例

    2019-05-09 21:45:44
    二进制表示负数的问题 我们知道十进制数1的二进制码用int型表示就是0000 0000 0000 0000 0000 0000 0000 0001 二进制码实际上并不能表示负数, 因为二进制数最小就是0000 0000 0000 0000 0000 0000 0000 0000 , ...
  • 首先,阅读这篇文章的你,肯定是一个在网上已经纠结了很久的读者,因为你查阅了所有你能查到的资料,然后他们都会很耐心的告诉你,补码:就是按位取反,然后加一。准确无误,毫无破绽。但是,你搜遍了所有俯拾即是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,512
精华内容 2,204
关键字:

为什么二进制补码为取反加一