计算机原理- 整数的补码,原码, 反码
解释一:对于整数来讲其二进制表示没有符号位.一个字节的表示范围为00000000-11111111,由此可见一个字节的整数表示范围为[0,255=2^8 - 1]。对于整数来讲,其二进制表示中存在一个符号位.先来看一下下面几个定义:
1:在计算机中,负数以其正值的补码形式表达。正数即在符号位补0.
2:原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
3:反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
4:补码: 反码+1
由以上可以得到.计算机储存有符号的整数时,是用该整数的补码进行储存的,0的原码、补码都是0;正数的原码、补码可以特殊理解为相同;负数的补码是它的反码加1
范围: 正数 [00000000 - 01111111] [0, 2^7 - 1] 负数 [10000000 - 11111111] 。范围说明. 11111111 - 1 = 11111110,取反=00000001 即是-1. 10000000 -1 = 01111111,取反=10000000,
-128. 因此有一个有符号二进制表示范围是从[-128-127].
解释二:大家都知道数据在计算机中都是按字节来储存了,1个字节等于8位(1Byte=8bit),而计算机只能识别01这两个数,所以根据排列,1个字节能代表256种不同的信息,即2^801两种可能,8位排列),比如定义一个字节大小的无符号整数(unsigned char),那么它能表示的是02550~2^8 -1)这些数,一共是256个数,因为,前面说了,一个字节只能表示256种不同的信息。别停下,还是一个字节的无符号整数,我们来进一步剖析它,0是这些数中最小的一个,我们先假设它在计算机内部就用8位二进制表示为00000000(从理论上来说也可以表示成其他不同的二进制码,只要这256个数每个数对应的二进制码都不相同就可以了),再假设1表示为000000012表示为000000103表示为00000011,依次类推,那么最大的那个数2558位二进制中就表示为最大的数11111111,然后,我们把这些二进制码换算成十进制看看,会发现刚好和我们假设的数是相同的,而事实上,在计算机中,无符号的整数就是按这个原理来储存的,所以告诉你一个无符号的整数的二进制码,你就可以知道这个数是多少,而且知道在计算机中,这个数本身就是以这个二进制码来储存的。
无符号的整数根本就没有原码、反码和补码。只有有符号的整数才有原码、反码和补码的!其他的类型一概没有。虽然我们也可以用二进制中最小的数去对应最小的负数,最大的也相对应,但是那样不科学,下面来说说科学的方法。还是说一个字节的整数,不过这次是有符号的啦,1个字节它不管怎么样还是只能表示256个数,因为有符号所以我们就把它表示成范围:-128-127它在计算机中是怎么储存的呢?可以这样理解,用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来储存数的绝对值的话,能表示2^7个数的绝对值,再考虑正负两种情况,2^7*2还是256个数。首先定义0在计算机中储存为00000000,对于正数我们依然可以像无符号数那样换算,从0000000101111111依次表示1127。那么这些数对应的二进制码就是这些数的原码。到这里很多人就会想,那负数是不是从1000000111111111依次表示-1-127,那你发现没有,如果这样的话那么一共就只有255个数了,因为10000000的情况没有考虑在内。实际上,10000000在计算机中表示最小的负整数,就是这里的-128,而且实际上并不是从1000000111111111依次表示-1-127,而是刚好相反的,从1000000111111111依次表示-127-1负整数在计算机中是以补码形式储存的,补码是怎么样表示的呢,这里还要引入另一个概念——反码,所谓反码就是把负数的原码(负数的原码和和它的绝对值所对应的原码相同,简单的说就是绝对值相同的数原码相
)各个位按位取反,是1就换成0,是0就换成1,如-1的原码是00000001,和1的原码相同,那么-1的反码就是11111110,而补码就是在反码的基础上加1,即-1的补码是11111110+1=11111111,因此我们可以算出-1在计算机中是按11111111储存的。
总结一下,计算机储存有符号的整数时,是用该整数的补码进行储存的,0的原码、补码都是0,正数的原码、补码可以特殊理解为相同,负数的补码是它的反码加1
下面再多举几个例子,来帮助大家理解!
例: 47→101111 有符号的整数
原码     反码       补码 
47       00101111  11010000    00101111(正数补码和原码相同)
47   00101111  11010000    11010001(负数补码是在反码上加1

关于补码:
补码
[]表示机器数(原码),x是真值(二进制)
            x=+0.1001,[]原=0.1001
   x=-0.1001,[]原=1.1001

对于0,原码中有“+0”“-0”之分,故有两种形式:
                [+0]=0
                [-0]=0
采用原码表示法简单易懂,但它的最大缺点是加法运算复杂。这是因为,当两数相加时,如果是同号则数值相加;如果是异号,则要进行减法。而在进行减法时还要比较绝对值的大小,然后大数减去小数,最后还要给结果选择符号。

为了解决这些矛盾,人们到了补码表示法。机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。
负数用补码表示时,可以把减法转化为加法。这样,在计算机中实现起来就比较方便
[]补=  {    x       1>x≥0 
                  {    2+x=2|补码的最小负数| 0≥1
            x=+0.1011,[]补=0.1011
   x=-0.1011,[]补=10+x=10.0000-0.10111.0101
对于0[0]补=[0]补=0.0000                                 (mod  2)
例子中是以定点小数为例。
补码的原理可以用钟表来描述
如设标准时间为4点正;一只表已经7点了,为了校准时间,可以采用两种方法:一是将时针退  7-4=3  格;一是将时针向前拨12-3=9格。即7-37+9(mod12)等价,因此,把负数用补码表示的mod2操作,可以把减法转化为加法。
 

补码说明:
1、 在计算机系统中,数值一律用补码来表示(存储)。
  主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
2、 补码与原码的转换过程几乎是相同的。
  数值的补码表示也分两种情况:
  1)正数的补码:与原码相同。  例如,+9的补码是00001001
  2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1
 例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码0000111按位取反为1111000;再加1,所以-7的补码是11111001
  已知一个数的补码,求原码的操作分两种情况:
  1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
  2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1
 例如,已知一个补码为11111001,则原码是10000111-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余71111001取反后为0000110;再加1,所以是1000
0111
3、  我在这里介绍一下的概念:
  “是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个
例如: 时钟的计量范围是011,模=12
  表示n位的计算机计量范围是02^(n)-1,模=2^(n)
实质上是计量器产生溢出的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。
例如: 假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:
一种是倒拨4小时,即:10-4=6  另一种是顺拨8小时:10+8=12+6=6
在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。
而言,84互为补数。实际上以12模的系统中,111102937566都有这个特性。共同的特点是两者相加等于模。
对于计算机,其概念和方法完全一样。n位计算机,设n=8 所能表示的最大数是11111111,若再加1称为100000000(9),但因只有8位,最高位1自然丢失。又回了000000
00,所以8位二进制系统的模为2^8 在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码。
  另外两个概念
  一的补码(one's complement) 指的是正数=原码,负数=反码
  而二的补码(two's complement) 指的就是通常所指的补码。
4、 这里补充补码的代数加减运算:
 1)补码加法
  [X+Y] = [X] + [Y]
  【例7X=+0110011,Y=-0101001,求[X+Y]
  [X]=00110011 [Y]=11010111
  [X+Y] = [X] + [Y] = 00110011+11010111=00001010
  注:因为计算机中运算器的位长是固定的,上述运算中产生的最高位进位将丢掉,所以结果不是
  100001010,而是00001010
  2)补码减法
  [X-Y] = [X] - [Y] = [X] + [-Y]
  其中[-Y]补称为负补,求负补的方法是:对补码的每一位(包括符号位)求反,最后末位加“1”

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。