精华内容
下载资源
问答
  • 二进制补码

    热门讨论 2020-07-12 21:07:00
    每次设计二进制的问题,总是心里有点发虚,怕做不出来,我想这应该就是没有学透,所以打算在复习一遍,上星期忙于工作,疏于学习,想了想不知道博客该写些什么,坐下来回忆一下学的知识,想到了补码,居然有些模糊,...

    总感觉二进制学的不是很透彻,每次设计二进制的问题,总是心里有点发虚,怕做不出来,我想这应该就是没有学透,所以打算在复习一遍,上星期忙于工作,疏于学习,想了想不知道博客该写些什么,坐下来回忆一下学的知识,想到了补码,居然有些模糊,就来复习一下吧。

    计算机中的有符号数有三种表示方法,原码,反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同 。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

    没写完,先做个占位吧。

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

    为什么需要补码

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

    百科概念

    计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。

    在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

    从百科解释来看是为了减少硬件电路设计,这是最终目的。从设计目的来看实在感慨设计师的巧妙。

    下面我们分析一下,为什么原码取反加一就能够减少硬件电路,换句话说,为什么取反加一就可以将减法转化为加法?

    定义和原理

    从百科来看,给补码下个定义比较困难,就好比解释什么是筷子一样。我们可以抛开计算机,从人类社会数学的概念出发,给补码定义如下:

    所谓补码就是某个数n,这个数加上-n=0。这也是补码的基本原理。

    我们将二进制的首位为0解释为正数,1解释为负数

    f774a73a06ad?from=singlemessage

    补码.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中不需要减法器电路以减少设计成本。

    展开全文
  • 0.1.2 二进制补码

    2014-09-03 13:44:00
    《编程导论(Java)·0.1.2 二进制补码》 p6:【冯•诺伊曼体系结构计算机使用二进制。人类之所以习惯十进制,据说是由于手指头来计算比較方便,而人正好10个指头。】 本节就2面(page6和p7)纸。尽管二进制...

    《编程导论(Java)·0.1.2 二进制补码》


    p6:【冯•诺伊曼体系结构计算机使用二进制。人类之所以习惯十进制,据说是由于用手指头来计算比較方便,而人正好有10个指头。】

    本节就2面(page6和p7)纸。尽管二进制补码属于每一个程序猿都应该熟练掌握的内容,但通常安排同学们自学。

    重点要理解:为什么要採用补码?


    将10进制数转换为二进制数时,负数怎样在二进制中表达呢?为了解说的方便,这里使用半个字节(Nibble)即4位为数据长度。

    将最高位作为符号位是自然的想法。通常以0表示正、1表示负。去掉符号位后,正数就剩下的3位来表示0~7,0b0000~0b0111等称为原码。对于负数有一种简单但有问题的表示方式:符号加绝对值,如图0-4中间一列所看到的。


    图 0‑4 补码

    它有两个问题(以下的01串不是正规的二进制表示,因而不加前缀0B):

    •  在整个0000至1111的编码中,出现了两个0,即0000和1000表示+0和-0。想推断一个数是否等于0的时候,会给编程带来麻烦。
    •  更关键的问题是,两个正数的加法与两个正数的减法(也即一个正数加一个负数)没有统一的运算法则。以下是出了问题的样例:

    6-3 = 0110 + 1011 = 0001 = 1;
    -3-2= 1011 + 1010 = 0101(有溢出) = 5

    为了解决这些问题,计算机科学中,以二进制补码(the two’s complement)来编码数值。

    负数的补码算法:将相应的正数每位取反,然后最低位加1。

    比如求-5的补码例如以下:

    相应的正数: 0b0101

    每位取反:   0b1010

    最低位加1:   0b1011



    要求完毕:

    • 练习0-11:有人找程序猿借了500元钱,后来又想借500元,程序猿说,干脆凑个整数,这是524块。为什么唐纳德·克努特给找出其巨著中任一错误的读者2.56美元?(请熟记2的各次幂)
    • 练习0-12:请严格地定义二进制补码规则。提示:符号位、正数的补码、负数的补码。(我们不给出二进制补码规则,仅介绍负数的补码算法,其它你自己搞定)
    • 练习0-13:数据长度为n位的有符号二进制整数,为什么最大正数为2n-1 -1?可以表示的最大负数为多少?(Java整形的取值范围)
    • 练习0-16:计算下列各题:(1)0x9AB4+0x5C; (2) 0170-023 ;(3) 0b1101*0b101

      练习0-17.:转换进制。(1) 0b1001_1100 = 0____;(2) 0x7F = 0b_______ ;(3) 0107 = 0b_________。


    • 在学习《第12章位运算》时,本节的知识是基础,非常重要。
    • 最好的练习项目:整形算术编码。

    展开全文
  • 什么需要补码 在真实世界里,常常需要负数。如果存储在存储设备中的最小值为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
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • 8位二进制表示机器数[一个符号位] 原码表示的范围-127~+127 而补码表示则是-128 ~ +127 ----> 10000000~01111111,为什么10000000就是表示-128, 回答: 因为一位是符号位,所以后7位是数值位。 2^7=128,...
  • 二进制补码是在《计算机科学概论》中讲授的基本概念,本注记试图讲述:什么是补码,为什么需要补码,补码的运算规则,而最重要的是试图说明,补码规则为什么是如此定义的。从而引申出一个也许不大准确的结论:计算机...
  • 大家都知道:符号数的负数的补码是 其正数的反码+1,例如 10001111 的补码是反码01110000 加 1 =01110001 ,很多书都这么说,可是为什么这样计算的结果就是它的补码? 在某些计算机组成原理书上提到:其实补码的...
  • 二进制补码和反码和源码的关系 一:为什么二进制原码反码补码 我们知道,一个数在计算机中使用二进制来表示的。以下都一个字节来表示二进制的存储。例如:+1表示成二进制为00000001,-1表示成二进制为...
  • 二进制究竟有什么用? 原码 反码 补码 7种位运算 当然了,位运算还有很多奇技淫巧,如果大家还想看进阶篇,记得给我点赞或者留言告诉我哦~ 二进制的作用 在实际生产中,二进制是用来优化时间和空间的。 二进制...
  • 位运算究竟有什么用?原码 反码 补码7 种位运算当然了,位运算还有很多奇技淫巧,如果大家还想看进阶篇,记得给我点赞或者留言告诉我哦~位运算的作用 在实际生产中,位运算是用来优化时间和空...
  • (给算法爱好者加星标,修炼编程内功)来源:小齐本齐计算机说到底就是 0 ...位运算究竟有什么用?原码 反码 补码7种位运算当然了,位运算还有很多奇技淫巧,如果大家还想看进阶篇,记得给我点赞或者留言告诉我哦~位...
  • 符号二进制,可以存储正数和负数,最高位为符号位,0表正,1表负数 正数5表示为 00000000 00000000 00000000 00000101 负数­-5表示为 10000000 00000000 00000000 00000101 3.介绍下二进制中的原码、补码、反码?...
  • 0-255的二进制如上图 我们惊奇地发现,如果二进制是无符号的,那么我们如何表示负数呢? 我们总不能+1表示正数,-1表示负数吧,计算机只认识0和1啊。。。于是种想法应运而生, 最高位为符号位,0表示正数,...
  • 位运算究竟有什么用?原码 反码 补码7 种位运算当然了,位运算还有很多奇技淫巧,如果大家还想看进阶篇,记得给我点赞或者留言告诉我哦~位运算的作用 在实际生产中,位运算是用来优化时间和空...
  • 位运算究竟有什么用?原码 反码 补码7 种位运算当然了,位运算还有很多奇技淫巧,如果大家还想看进阶篇,记得给我点赞或者留言告诉我哦~位运算的作用 在实际生产中,位运算是用来优化时间和空...
  • (给算法爱好者加星标,修炼编程内功)来源:小齐本齐计算机说到底就是 0 ...位运算究竟有什么用?原码 反码 补码7种位运算当然了,位运算还有很多奇技淫巧,如果大家还想看进阶篇,记得给我点赞或者留言告诉我哦~位...
  • 进制、十六进制补码

    千次阅读 2014-11-08 17:33:25
    不过,由于数据在计算机中的表示,最终以二进制的形式存在,所以时候使用二进制,可以更直观地解决问题。 但,二进制数太长了。比如int 类型占用4个字节,32位。比如100,int类型的二进制数表达将是: ...
  • 补码定义:计算机中二进制形式的补数。 这个定义是比较抽象的,下面我将举一些实际的例子来解释。 二进制形式:就是0和1组成的串,例如数字3的二进制形式是11,数字-9的二进制形式是11001。 补数:初中时我们学过互...
  • 在学习二进制计算时,实际计算机中使用补码来存负数,从而将所有的减操作都化为加操作,我当时个疑问,为什么能够带带符号操作室所有的符号位都能被正确的表示出来, 举个例子: 10-1时 2进制表示 (0)1010 + ...
  • -128没有原码和反码,只有补码,补码为 1000 0000。...为什么补码有-128呢???问题就出在了0上,我们知道原码与反码有正负零之分但补码并没有。 [+0]原码=0000 0000, [-0]原码=1000 0000 [+0]反码=0000 0000,...
  • 补码有什么用

    2021-01-22 17:40:51
    启文   最近重学C++(为什么不用python、java?因为性能)了解到,C++编程语言很难理解,听说想理解C++语言就需要学习汇编...  CPU只有加法器只能做加法,而且是01二进制进行加法运算。   减法怎么表示?就需要
  • 二进制的编码(原码、反码、补码) 1.二进制怎么编码? 1字节 = 8位,所以它能表示的最大数当然是8位都是1(既然2进制的数只能是0或1,如果是我们常见的10进制,那就8位都为9)1字节的二进制数中,最大的数:...
  • 通过阅读本文章,你不仅可以加深对这些问题的理解,更重要的是,可以学会十进制与二进制补码的快速转换、区分C语言中usigned int和普通int的二进制表示方法,那么让我们开始吧.1. 补码的本质补码(Two's complement)是...
  • 计算机对带符号数的表示三种方法:原码、反码和补码。... 10000000-11111111表示-128到-1, 00000000-01111111表示0-127 补码的1111 1111转换成原码就是1000 0001,也就是-1,补码就是二进制表...
  • 如果后两个问题你都回答是,那就意味着,当3位二进制进行存储、且符号位0表示正,1表示负时,1会存储成001,-1会存储成101。 可惜事实不是这样,计算机中是用补码的形式而不是刚刚那种看上去很自然的形式存储整数...
  • 计算机对带符号数的表示三种方法:原码、反码和补码。... 10000000-11111111表示-128到-1, 00000000-01111111表示0-127 补码的1111 1111转换成原码就是1000 0001,也就是-1,补码就是二进制表示负数的

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 324
精华内容 129
关键字:

二进制补码有什么用