精华内容
下载资源
问答
  • 补码意义

    2021-07-29 01:14:22
    基本概念在计算机中,二进制数据有三种形式:原码、反码和补码,要弄清楚补码意义,首先让我们来了解三种形式的定义。假设字长为4,其中最高位为符号位:正数为0,负数为1。剩下的3位表示该数的绝对值。正数的原码...

    基本概念

    在计算机中,二进制数据有三种形式:原码、反码和补码,要弄清楚补码的意义,首先让我们来了解三种形式的定义。

    假设字长为4,其中最高位为符号位:正数为0,负数为1。剩下的3位表示该数的绝对值。

    正数的原码反码补码都是一样的。

    1.原码

    +3的原码:0011

    -3的原码:1011

    2.反码

    反码就是在原码的基础上,符号位不变其他位按位取反(就是0变1,1变0)就可以了。

    +3的反码:0011

    -3的反码:1100

    3.补码

    补码也非常的简单,就是在反码的基础上按照正常的加法运算加1。

    +3的补码:0011

    -3的补码:1101

    从前面的三种数字编码类型的定义,我们可以看出数据的原码,使用符号位来区分了正负数,更加符合人脑直观识别并且用于计算的表达方式。但是在计算机中,是通过补码的形式保存数据,下面将解释为什么计算机系统要用补码存放数据。

    周期系统

    若一组事件或现象按同样的顺序重复出现,则把完成这一组事件或现象的时间或空间间隔,称为周期。

    周期性原码累加系统

    定义一个字长为4的二进制累加系统,该系统的规则就是从左到右依次累加0001;

    0000

    0001

    0010

    0011

    0100

    0101

    0110

    0111

    1000

    1001

    1010

    1011

    1100

    1101

    1110

    1111

    0000

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    0

    如果最高位是符号位时,图表第二行表示原码对应的10进制数,不难发现,如果在确定字长为4时,累加过程是符合周期性变化的,原因就是当1111+1时会出现字节溢出的情况,10000的最高位溢出失效,导致结果变为0000;

    周期性时钟系统

    ad19dabb3ae0

    在现实生活中,时钟显然是符合周期性的,12点过后是1点,人们早已习惯了这种思维方式,所以会忽略对时钟这种表示时间方式的思考。凌晨12点加1个小时,其实表式的时间是天数加1之后的1点,但是对于时钟系统而言,天数不是自己所能表示的,这就相当于上面图表中1111+1=0000(1|0000 1是溢出位,在字长为4的系统中是不能表示的)。

    时钟系统和二进制数原码的累加系统都有周期性,具有周期性的原因是当前层次系统中有其不能表示或未能感知的其他层次系统。

    计算机运算系统正是利用了周期性的这一特性。

    周期系统中的加减转化

    时钟系统加减法转化

    假设时针向顺时针方向拨动为加,逆时针拨动为减。

    7点顺时针拨动1格表示的是:7+1=8

    7点逆时针拨动1格表示的是:7-1=6

    7点顺时针拨动11格表示的是:7+11=6

    所以很容易发现,在时钟中7-1=7+11,这就是周期系统中加减法发的转化方式,其实和简单,也很符合我们的直觉。

    所以重新考虑原码的减法问题,n-m = n+(MAX-m),其中MAX就是该周期中所能表示的所有数的数量,放到上面原码的例子中就是16个,而放到时钟系统中就是12个。如:

    周期性的时钟系统:

    12 - 1 = 12 + (12 -1);

    7 - 4 = 7 +(12-4);

    累加系统加减法转化

    在说原码累加系统加减法转化例子之前,我们再看下图表

    A

    0000

    0001

    0010

    0011

    0100

    0101

    0110

    0111

    1000

    1001

    1010

    1011

    1100

    1101

    1110

    1111

    0000

    A1

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    0

    A2

    0

    1

    2

    3

    4

    5

    6

    7

    -0

    -1

    -2

    -3

    -4

    -5

    -6

    -7

    0

    B

    0000

    0001

    0010

    0011

    0100

    0101

    0110

    0111

    1111

    1110

    1101

    1100

    1011

    1010

    1001

    1000

    0000

    B1

    0

    1

    2

    3

    4

    5

    6

    7

    -7

    -6

    -5

    -4

    -3

    -2

    -1

    -0

    0

    B2

    0

    1

    2

    3

    4

    5

    6

    7

    -8

    -7

    -6

    -5

    -4

    -3

    -2

    -1

    0

    为了方便说明在每一行的开始定义了该行的名称分别为A、A1、A2、B、B1、B2.

    累加系统不同于周期系统的一点是会有负数的概念出现,A2行就是最高位表示符号位时原码解码后表示的十进制数。在图表中发现,当有符号位时二进制原码的累加转换为十进制数时,出现了与我们现实生活数学公理相违背的现象,错误发生在最高位为1后,如1001+1=1010(-1+1=-2),原因是在定义这个累加系统在运算时就没有让系统知道高位0与1有不同之处,也就是累加的计算过程中无法感知符号。

    解决问题的方式有两种

    去重新完善这个累加系统,让他在最高位为1换一套计算方式,也就是说在运算过程中去感知最高位的意义。

    转化出现问题的状态,使状态转移为当前系统能使用的,也就是在编码过程中去让无法感知符号的运算系统计算出正确的结果。

    在计算机系统中,解决这个问题的方式显然是用第二种,cpu是无法感知符号位的,这样做可以减少cpu设计难度,极大地提高运行效率。

    所以也就是说cpu运算时还是按照A行进行累加,但在解码运算结果时做一些处理,即将A转变为B,而B1是不考虑溢出和临界值时的十进制正确结果。A解码为B的算法就是当最高位为1时,符号位不变,其他位取反,不难发现这就是反码的定义。

    当这样转化后会发现出现了0和-0两个0并且会出现0 - 1 = -0这种情况(将0向左移动)。所以还得做一个简单的处理,就是去加一个1,也就是B1转化为B2,而B2就是最终的正确十进制值。

    其实按照直觉可以发现,当符号位转化时,其他位应该取反才能得到正确结果,正数越加越大,负数越加越小。

    根据我们的努力将A通过反码的解码方式转变为B,而让B的解码结果加1(补码),得到了B2,从而使累加系统当出现负数时变得合理起来。在转变为B2之后,我们需要解决的是如何用累加系统去表示减法。本质上和前面的时钟系统转化是一样的。可以借助上面的时钟系统以及下面的例子去理解累加系统的减法运算。

    在看例子之前,稍微介绍一下“模” 的概念:

    模是指一个计量系统的计数范围,取模运算实质上是计量器产生“溢出”的量,前面的周期系统中n-m = n+(MAX-m)得出的加减转化其实就是用到了模的概念,MAX就是模。

    计算 4 - 3

    编码 0100 - 0011

    //n-m = n+(MAX-m) ==》(10000-0011) 其结果就是0011的补码

    转化为 0100 + (10000-0011) = 0100 + 1101

    cpu调用加法器得出 10001

    最高位溢出 0001

    解码 1

    重新计算 3 - 4

    编码 0011 - 0100

    转化为 0011 + (10000-0100) = 0011 + 1100

    cpu调用加法器得出 1111

    //参考A转变B2(也就是原码转补码)

    解码-0001= -1

    总结

    在计算机系统中,计算整数加减法时,需要经过以下步骤:

    转变为2进制数;

    运算时原码解码为补码;n-m = n+(MAX-m),(MAX-m)也就是m的补码,理解时参考时钟系统。

    cpu调用加法器;

    解码;再进行一次补码解码,理解时参考A转化为B2。

    展开全文
  • 通俗理解补码意义

    千次阅读 2019-04-11 12:08:31
    补码 0 0000 0000 1 0001 0001 7 0111 0111 -8 -1000 1000(1111+0001-1000) -7 -0111 1001(1111+0001-0111) -1 -0001 ...

    数有正负之分,我们平时用0,1,2,3,4,5,9,10,20,8948等表示正数,在正数前面加上符号 “-” -1,-2,...,-10等来表示负数。但在计算机的世界里没有符号 “-”,只有0和1。而且,我们还要将减法器从计算机的世界里拿走。因为加法器要比减法器简易并且廉价。 计算机表示数的规则是0和1的组合,加法器的规则是进行与或运算,也就是我们平常理解的加法运算。没有了减法器如何让计算机完成减法运算呢?

    请看下面的例子:钟表上用0-23表示整点的时间,钟表不能倒着走,只能往前走,但10点过去之后会有8点。也就是10点过去22个小时之后就是8点。那就是10加上22等于8。这不就是用加法10+22完成了减法10-2嘛!现在我们看看这到底是怎么实现的,10+22=32,但时间最大就是23,没有32。10加上22之后之所以是8是因为,在23点过去一个小时之后,时间又从0开始计数。也就是23+1=0,那么10+22=23+1+8=0+8=8。这样我们可以把时钟看作计算器,x+y的结果就是x点开始过去y个小时后的时刻,x-y其实是x点开始过去23+1-y个小时的时刻。x-y=x+(-y)=x+(23+1-y),所以-y=23+1-y。那么时钟上的数对应的正负数如下表所示:

    数  x时钟
    00
    33
    1111
    -1212(最大时间+1-12)
    -123(最大时间+1-1)

    计算机中也存在同样的情况,计算机能表示的数是有限的,这和钟表的原理一样,钟表最大是23,假设有个计算机只有4位,其最大只能表示1111,换算成10进制就是15。所以该计算机只能表示-8-7的十进制数,按照上面所说的计算机计算规则,如果我们想用4位的计算机完成2+3的运算只需将0010(2)和0011(3)输入加法器即可,完成3-2的运算则需要将0011(3)和1110(14=15+1-2)输入加法器,由于计算机只有4位,10001多余的高位溢出,所以其输出为0001(1)。

    我们规定用以下规则表示我们熟悉的10进制数:

    10进制数二进制补码
    000000000
    100010001
    701110111
    -8-10001000(1111+0001-1000)
    -7-01111001(1111+0001-0111)
    -1-00011111(1111+0001-0001)

     

    展开全文
  • 原码、反码与补码及其意义

    千次阅读 2018-05-28 00:15:24
    原码、反码与补码及其意义 (1)数值数据的表示 我们把一个数在计算机内被表示的二进制形式称为机器数,该数称为这个机器数的真值。机器数有固定的位数,具体是多少位与机器有关,通常是8位或16位。机器数把真值的...

    原码、反码与补码及其意义 

    (1)数值数据的表示 
    我们把一个数在计算机内被表示的二进制形式称为机器数,该数称为这个机器数的真值。机器数有固定的位数,具体是多少位与机器有关,通常是8位或16位。机器数把真值的符号数字化,通常用最高位表示符号,0表示正,1表示负。例如,假设机器数为8位,最高位是符号位,那么在定点整数的情况下,00101110和10010011的真值分别为十进制数+46和-19。 
    (2)原码: 
    一个整数的原码是指:符号位用0或1表示,0表示正,1表示负,数值部分就是该整数的绝对值的二进制表示。 
    例如:假设机器数的位数是8,那么:[+17]原=00010001 [-39]原=10100111
    值得注意的是,由于 所以数0的原码不唯一,有“正零”和“负零”之分。 
    (2)反码 
    在反码的表示中,正数的表示方法与原码相同;负数的反码是把其原码除符号位以外的各位取反(即0变1,1变0)。通常,用[X]反表示X的反码。例如: 
    [+45]反 = [+45]原 = 00101101
    [-32]原 = 10100000
    [-32]反 = 11011111
    (3)补码 
    在补码的表示中,正数的表示方法与原码相同;负数的补码在其反码的最低有效位上加1。通常用[X]补表示X的补码。例如: 
    [+14]补 = 10100100
    [-36]反 = 11011011
    [-36]补 = 11011100
    注意:数0的补码的表示是唯一的,即[0]补=[+0]补=[-0]补=00000000
    现在我们来看看引进原码、反码与补码这几个概念到底有什么意义。先看下面的例子。例如:X = 52,Y = 38,求X – Y的值。 
    [X]补 = 00110100 
    [-Y]原 = 10100110
    [-Y]反 = 11011001
    [-Y]补 = 11011010 
    现在我们看看[X]补 + [-Y]补 等于多少? 
    [52]补:   0 0 1 1 0 1 0 0
    [-38]补:+) 1 1 0 1 1 0 1 0 
          1 0 0 0 0 1 1 1 0

    自然丢失 
    我们可以看到,最高位丢失后,结果(14)正是52-38的值。从这里我们不难体会到通过补码可以把减法运算变成加法运算来做。这样做有什么意义呢?实事求是地说,引入补码意义非同寻常,可以说是先辈们智慧的结晶。因为, 通过补码运算,可以把减法运算变成加法运算;而乘法可以用加法来做,除法可以转变成减法。这样一来,加、减、乘、除四种运算“九九归一”了。这对简化CPU的设计非常有意义,CPU里面只要有一个加法器就可以做算术运算了。
    展开全文
  • 补码有何存在意义?为什么要有反码?为什么要有补码? 先拿java的int 数据类型是32位,有符号的以二进制补码表示的整数;符号位为第一位, 最小值 ,第一位为1,其余为0,-2,147,483,648(-2^31) 最大值 ,第一位...

    目录

    1、前言,自己发明javb语言

    2、模

    3、先思考,为什么不能直接用源码计算

    4、主角的由来

    5、反应肯定是???


     

    最近在学习一下专栏里面的数学问题,提到二进制的东西的时候,想到了大多数人在学习的时候,死记硬背上反码是怎样,补码是怎样。

    现在回头问下自己,反码有何存在意义?补码有何存在意义?为什么要有反码?为什么要有补码?

    1、前言,自己发明javb语言

    先拿java的int 数据类型是32位,有符号的以二进制补码表示的整数;符号位为第一位,
    最小值 ,第一位为1,其余为0,-2,147,483,648(-2^31) 
    最大值 ,第一位为0 ,其余为1,2,147,483,647(2^31-1),是的,int型手机号码都放不下。

    因为位数太长,所以以下说明的时候不太方便,假如我现在发明了了,jbvb语言,接下来整篇分析里面,

    我们把int数据类型设置为4位。有符号的以二进制补码表示的整数;符号位为第一位,
    最小值 ,第一位为1,其余为0,1000,(-2^3)     = -8
    最大值 ,第一位为0 ,其余为1,0111,  ( 2^3 - 1)= 7

    2、模

    取模的除数就是数据类型的上限减去下限的值,再加上 1,也就是 (2^(n-1)-1)-(-2^(n-1))+1=2x2^(n-1)-1+1=2^n-1+1。
    这个除数为什么不直接写成 2^n 呢,这是因为 2^n 已经是 n+1 位了,已经超出了 n 位所能表示的范围。
    其实就是上限到下限的距离。

    那这里的模是2^4 = 16 

    7 + 1 = 0111 + 0001 = 1000 = -8 ,上溢出,超越上限,也就是最大值+1后 会变成最小值。

    还剩15的差值,-8 + 8 能回到0位置, 0+7 能回到7的位置。也就是说 7 + 模后,重新回到原来的位置。

     

    就是余数和取模的概念,这东西周而复始,其实跟时钟类似。

    类似时钟机制,假如现在是6点,顺时针加12个小时,这样就回到了6点。

     

    3、先思考,为什么不能直接用源码计算

    计算机里没有减法,减一个数,相当于加一个数后得到想要的值,然后就在这条路上去探索了。
    1 + (-1) 直接用原码计算是有问题的,还有符号位,所以直接一加是个负数,那这就有问题了。
    所以科学家开始想解决办法了

     

    4、主角的由来

    由前面可知,数值加上模后会回到原来的位置。

    由此将i-j + 模的值等同于 i - j ,   i-j=(i-j)+(2^n-1+1)=i+(2^n-1-j+1)

    2^n-1-j ,结果如下图,

    这个东西刚好是-1,除符号位外的取反。称为反码

     

    2^n-1-j+1,补码,反码加1 

     

    所以-1最终的补码与1相加 ,得到正确的值

     

     

    5、反应肯定是???

    这里的计算算的刚好,这里我看其他人也有相同的迷惑。

    问题一:为什么i-j得加上取模的除数?
    其实这个换个思路理解就行了,i-j是一个值,这个值加上模,其实就还是会回到原来的位置。

    问题二:
    最迷糊的地方来了,2^n-1就是32位1,这个地方就又没有符号位这个说吗吗?

    作者的解答是:我们只考虑(n-1)位的1,不考虑第一位

    一开始其实我也是没太明白这里的解释。
    其实就是回去最原始的地方,我们设定为4位,符号位为第四位,最大值也就2^3-1,现在是2^4,如果是真的符号位 也只是第5位作为符号位。

    现在想必大家都理解了。如果强制加上符号位,那么和j的值是对应不上长度的。所以把第一位去除直接计算。

    这个公式刚好就这么巧解释了整个补码的由来。
     

     

     

     

    展开全文
  • 2.补码意义 3.Verilog中的补码运算与定点小数 3.1补码定点小数的加减运算 3.2补码定点小数的乘除运算 3.3对运算的结果近似截取一定位宽 3.4实际应用中的例子 1.原码,反码,补码 原码:n位的二进制数,最高...
  • 反码、补码的作用和意义

    千次阅读 2018-08-07 11:33:15
    https://zhidao.baidu.com/question/536424181.html
  • 补码的计算及存在意义

    千次阅读 多人点赞 2018-04-14 17:16:49
    在计算机中,数据有三种形式:原码、反码和补码,要弄清楚补码的计算方法,首先让我们来了解三种形式的定义。1、原码 如果机器字长为n,那么一个数的原码就是用一个n位的二进制数,其中最高位为符号位:正数为0,...
  • 原码反码补码补码存在的必要性

    千次阅读 2018-08-17 16:41:13
    本博客整理自网络,仅供学习参考,如有侵权,联系删除。... 如何计算 ... 补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。 (即在反...
  • 补码,原码,反码的意义

    千次阅读 2017-03-21 22:29:59
    补码,原码,反码计算机组成原理中,有补码,原码,反码的概念,但是一直搞不清楚为什么,只是记忆公式,不明白是怎么来的,现在写下来要如何理解各种码之间的关系,以及怎么来的。补码我们用C语言来举例。C语言中...
  • 补码存在的意义

    2017-03-13 09:04:41
    数值在计算机中表示形式为机器数 ...于是就引入了补码概念 ...负数的补码就是对反码加一 ...正数的原码反码补码是一样的 ...在补码中用 ...所以就是,反码中存在负的零,而补码就把负的零抹去了
  • 补数/补码意义

    千次阅读 2016-08-30 15:49:40
    常在计算机科学中应用,被称为【补码】,在台湾和香港被称作二补数。 关于补码 补数在计算机中被成为补码(在港台被称为二补数) 有符号的二进制数的补码运算方法为: 正数:补码为其本身 负数:除符号位外,所有位...
  • 计算机中为何直接用数字的二进制原码进行计算,而是用原码的补码形式进行计算呢? 让我们来先看一个例子: 想象一个机械时钟,现在时针对应3点,顺时针拨一格(3+1)就是4点,逆时针拨一格(3-1)就是2点。...
  • 补码的作用

    千次阅读 2019-03-06 19:02:37
    补码的作用 :避免零在二进制中的歧义。另一个好处就是方便运算,所有运算都能用加法运算器来实现,不再需要减法运算器。其实在计算机中,所有的减法操作都被转化为加法操作,如果想要深入研究,可以看看计算机组成...
  • 补码的由来

    千次阅读 2020-10-12 16:09:36
    01111111 − a 01111111-a 01111111−a,此时得到的结果是a的按位取反的值,即反码 加上最前面的数字00000001,即再加上1 于是我们把这一系列的过程得到的机器码叫做补码,并且知道了,补码的机器码等于按位取反之后...
  • 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为: (-128~0~127)共256个. 注意:(-128)没有相对应的原码和反码, (-128) = (10000000) 补码的加...
  • 补码的计算和意义

    2018-06-07 09:44:01
    补码存在的意义https://www.cnblogs.com/QKSword/p/8149053.html
  • 注意:Java中,所有数据的表示方式都是以补码形式 补码:10000000 00000000 00000000 00000100 (java所有数据的表示方式都是以补码形式,所以把-4用二进制表现出来就是某个数的补码,只是我们看到的是-4) 反码:...
  • 一篇彻底学懂补码

    千次阅读 2021-03-12 17:45:46
    补码是计算机运算中的一种数据表示方式,它的存在意义是简化减法的运算。 许多人接触补码,仅是被告知是“正数不变,负数取反加一”,而对于为什么需要这么做,以及补码本身的存在意义并不清楚。 而网上关于补码的...
  • Java 原码 反码 补码

    2021-02-27 15:04:36
    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家...
  • 补码

    2018-11-02 11:49:24
    整数补码 编辑 求给定数值的补码分以下两种情况: ...正整数的补码是其二进制表示,与原码相同 [2] 。...(备注:这个+9的补码是用8位2进制来表示的,补码表示方式很多,还有16位二进制补码表示...
  • 补码运算的本质

    2020-04-20 11:44:21
    补码运算的本质数学原理就是取模求余 设二进位表示的位数共有nnn位,那么实际上所有的运算结果都对2n2^n2n求余 比如说有两个数aaa和bbb,他们相加的结果实际上就是(a+b)mod  2n(a+b)\mod 2^n(a+b)mod2n 但是直接...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,940
精华内容 5,576
关键字:

补码的意义