zoukankan      html  css  js  c++  java
  • 补码

    3.经常使用数值编码

    因为机器数在计算时,假设符号位和数值位同一时候參与运算,则可能会产生错误结果;而假设单独考虑符号问题,又会添加运算器件的实现难度。因此,为了使计算机可以方便地对数值进行各种算术逻辑运算,必须对数值型数据进行二进制编码处理。所谓编码是採用少量的基本符号(如01),依照一定的组合原则,来表示大量复杂多样的信息的技术。编码的优劣直接影响到计算机处理信息的速度。数值型数据的经常使用编码方法包含:原码、反码、补码。

    1)原码。原码的编码规则是:符号位0表示正,1表示负,数值部分用该数绝对值的二进制数表示。当整数时,小数点隐含在最低位之后;当纯小数时,小数点隐含在符号位和数值位之间,均不占位。通经常使用[X]表示数X的原码。

    比如,设机器字长为8位,

    [+1] = 00000001         [+127] = 01111111       [+0] = 00000000

    [ 1] = 10000001        [ 127] = 11111111       [ 0] = 10000000

    显然,按原码的编码规则,零有两种表示形式。

    原码表示法简明易懂,与其真值的转换方便,比較easy进行乘除运算。可是在进行加减运算时,原码运算非常不方便。因为符号位不能和数值一样參与运算,所以要依据两数的符号情况,同号相加,异号相减,还要依据两数的绝对值大小,令大数减去小数,最后还要推断结果的符号。这样不仅要求运算器既能作加法,又能作减法,还必须附加很多条件推断的处理,终于既添加了运算器的实现复杂性,又延长了运算的时间。

    2)反码。反码的编码规则是:符号位0表示正,1表示负,正数的反码等于原码,负数的反码等于原码除符号位外按位取反,即0110。通经常使用[X]表示数X的反码。

    比如,设机器字长为8位,

    [+1] = 00000001         [+127] = 01111111       [+0] = 00000000 

    [ 1] = 11111110          [ 127] = 10000000     [ 0] = 11111111

    显然,按反码的编码规则,零也有两种表示形式。

    反码非常easy由原码获得,但相同不方便运算,一般在求补码的过程中用到反码。

    3)补码。补码的编码规则是:符号位0表示正,1表示负,正数的补码等于原码,负数的补码等于反码末位加1。通经常使用[X]表示数X的补码。

    比如,设机器字长为8位,

    [+1] = 00000001         [+127] = 01111111       [+0] = 00000000

    [ 1] = 11111111          [ 127] = 10000001     [ 0] = 00000000

    显然,按补码的编码规则,零有惟一的表示形式。

    补码的概念来源于数学上的和补数。比如,将钟表的时针顺时针拨快5小时和逆时针拨慢7小时,最后指示的位置同样,则称57互为模12情况下的补数。计算机中机器数受机器字长限制,所以是有限字长的数字系统。对于整数来说,机器字长为n位(含符号位),模是2n;对于有符号纯小数来说,模是2

    求补运算通常利用反码来实现。

    【例】 X = +1011Y = 1101的原码、反码和补码。

        [X] = 01011                [Y] = 11101

           [X] = 01011                [Y] = 10010

           [X] = 01011                [Y] = 10011

    採用补码进行加减运算十分方便。通过对负数的编码处理,同意符号位和数值一起參与运算,能够把减法运算转化为加法运算。不论求和求差,也不论操作数为正为负,运算时一律仅仅做加法,从而大大简化运算器的设计,加快了运算速度。

    比如,(9)+(5)的运算例如以下:

    [9] = 11110111                  11110111

    [5] = 11111011           +     11111011

                                          111110010

    由于机器字长的限制,丢失高位1,运算结果机器数为11110010,是14的补码形式。

    眼下,因为计算机中最多的运算是加减运算,为了简化运算器设计,加快运算速度,有些计算机在数值表示、存储、运算时均採用补码表示法,也有些计算机,数用原码进行存储和传送,运算时採用补码,还有些计算机在进行加减法时採用补码运算,而在进行乘除法时採用原码运算。

    4.精度和溢出

    现代数字计算机是有限字长的数字系统,机器数表示的范围受到机器字长和数据类型的限制,一旦机器字长和数据类型确定了,机器数所能表示的数的范围和精度也就确定了。所谓精度,是指能够给出的有效数字的位数。一般来说,机器字长越长,能够表示的数的范围越大,精度越高;当字长同样时,浮点数通常比整数能够表示的数的范围要大;浮点数表示时,阶码位数越多,能够表示的数的范围越大,尾数位数越多,能够表示的数的精度越高。

    假设一个数的大小超出了计算机所能表示的数的范围,则产生溢出。假设两个正数相加,结果大于机器所能表示的最大正数,称为上溢;假设两个负数相加,结果小于机器所能表示的最小负数,称为下溢。比如,字长为n位的有符号整数,最高1位为符号位,数值位为n1位,用补码表示时,数的表示范围为2n–1~2n–11,一旦运算时发生结果超出此范围的情况,就产生溢出。

  • 相关阅读:
    HDU 1075 What Are You Talking About(字典树)
    HDU 1075 What Are You Talking About (stl之map映射)
    HDU 1247 Hat’s Words(字典树活用)
    字典树HihoCoder
    HDU 1277全文检索(字典树)
    HDU 3294 Girls' research(manachar模板题)
    HDU 3294 Girls' research(manachar模板题)
    HDU 4763 Theme Section(KMP灵活应用)
    Ordering Tasks UVA
    Abbott's Revenge UVA
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4089601.html
Copyright © 2011-2022 走看看