精华内容
下载资源
问答
  • 数值型数据的表示

    千次阅读 2018-10-12 22:48:37
    一个数值型数据的完整表示包含三方面: (1)采用什么进位计数制,通俗地讲,就是逢几进几; (2)如何表示一个带符号的数,即如何使符号数字化,这就涉及机器数的编码方法,常用的有原码和补码。 (3)小数点应该如何...

    又闹分手qwq想死啊(真分了 我这篇文章还没写完 - 还没写完 就又回来了QAQ开心 好好努力!) 

    一个数值型数据的完整表示包含三方面:

    (1)采用什么进位计数制,通俗地讲,就是逢几进几;

    (2)如何表示一个带符号的数,即如何使符号数字化,这就涉及机器数的编码方法,常用的有原码和补码。

    (3)小数点应该如何处理,有两种方法,即定点和浮点表示。

    1.进位计数制:(S)r=XnR^n+Xn-1R^n-1+...X0R^0+X-1R^-1+X-2R^-2+.....X-mR^-m.

    数的进位制涉及两个基本概念:基数r和各数位的权值r^i。它们是构成某种进位制的两个基本要素。基数r是某种进位制中会产生进位的数值,等于每个数位中允许的最大数码值加1。

    在进位制中每个数位都有自己的权值,它是一个与所在数位相关的常数,称为该位的位权,简称为权。

    二进制和八进制可以通过分段转换(3对1),十六进制和二进制(4对1)也是如此。

    十六进制除了基本的(BC3.89)[16]这种表示,还有一种以H为后缀的标注方式。

    二进制和十进制的转换是8421码。也是通过四位二进制位进行替换。

    2.各种进位制之间的相互转换。

    十进制整数转换为二进制整数:

    (1)减权定位法

    从高位起,从十进制数中逐渐分离出二进制位。

    若转换后的二进制代码序列为XnXn-1...X1X0,则从高位起将十进制数依次与二进制数各位的权值进行比较,若够减,则对应位Xi=1,减去该位权值后继续往下比较;若不够减,则对应位Xi=0,越过该位后继续往下比较;如此反复进行,直到所有二进制位的位权都比较完毕为止。

    (2)除基取余法

    将二进制展开的多项式整数部分除以二进制的基数2,得到S/2=(Xn2^n-1+Xn-12^n-2+...X12^0)+X0/2.显然括号内的是除2操作后得到的商,而X0是余数。若余数为0,表明X0=0;若余数为1,则表明X0=1。继续对商除以基数2,可依此判定多项式的各项系数(X1~Xn)。

    十进制小数转换为二进制小数:

    (1)减权定位法:类似。

    (2)乘基取整法:

    S=X-1*2^-1+X-2*2^-2+....X-m2^-m

    2S=X-1+(X-2*2^-1+.....X-m2^-m+1)。

    显然,括号内仍为小数;若2S出现整数部分,则表明X-1为1;若2S仍为小数,则表明X-1为0.继续对小数部分乘以基数2,根据各次乘积是否出现整数部分,依次判定X-2~X-m。

    二进制整数转换为十进制整数

    (1)按权相加法:二进制数展开成多项式求和的结果。

    (2)逐次乘基相加法:

    S=Xn2^n+Xn-12^n-1+X12^1+X02^0

    ={[(Xn*2+Xn-1)*2+Xn-2]*2+...}*2+X0

    从二进制的最高位开始,乘以基数2,然后与次高位也就是相邻低位相加;所得结果在乘以基数2,再与相邻低位相加;如此继续,直到加上最低位为止,所得就是最后结果。

    二进制小数转换为十进制小数:

    (1)按权相加法:如题。

    (2)逐次除基相加法:

    S=X-12^-1+X-22^-2+...+X-m2^m

    =2^-1*{X-1+2^-1*[X-2+....2^-1*(X-m+1+2-1*Xm)]}

    3.带符号数的表示

    真值:在日常的书写习惯中,往往用正、负加绝对值表示数值,用这种形式表示的数值称为真值。

    机器数:在计算机内部使用的,连同数符一起数字化了的数。

    CPU硬件一般支持补码运算和原码运算。

    (1)原码表示法

    约定:让数码序列的最高位为符号位,符号位为0表示该数为正,为1表示该数为负。数码序列的其余部分为有效数值,用二进制数绝对值表示。

    若定点小数的原码序列为X0.X1X2...Xn,则:

    [X]原=

    X,                 0<=X<1

    1-X=1+|X|,   -1<x<=0

    若定点整数的原码序列为XnXn-1...X0,其中Xn表示符号位,则:

    [X]原=

    X                       0<=X<2^n

    2^n-X=2^n+|X| -2^n<X<=0

    注意:若X=-1011,则5位字长:11011;8位字长:10001011;

    (2)补码表示法

    在有模运算中,一个负数可以用一个与它互为补码的正数来代替。

    补码定点小数的表示范围为-1~+1,以2为模。

    计算机的寄存器与运算部件都有一定的字长限制,如一定位数的计数器,在计满后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,相当于时钟例子中的模12.因此,计算机中的运算也是一种有模运算。

    1.补码定义:

    补码的统一定义式如下:[X]补=M+X(mod M)

    模为M,X是真值;[X]补是数X的补码,或称为X对模M的补数,可简写为X补。

    若X>=0,式中的模M可作为溢出量舍去。反之,则X补=M+X=M-|X|。

    定点小数的补码定义式:若定点小数的补码序列为X0.X1X2...Xn,其溢出量为2^1(注意:符号位X0的权值是2^0),因此以2为模。

    [X]补=

    X,0<=X<1

    2+X=2-|X|,-1<=X<0

    定点整数也是如此。

    需要注意的是:当机器数字长超过有效数值的位数时,高位部分补1。

    由真值、原码转换为补码:

    <1>正数的补码表示和原码相同。

    <2>负数:符号位保持1不变,其余位变反,然后在末位+1.

    PS:通常将除符号位外的有效数值部分称之为尾数。

    <3>符号位保持为1不变,尾数部分自低位向高位,第一个1及以前的各低位0都保持不变,以后的各高位则按位变反。

    由补码表示转换为原码与真值:

    <1>[+0]原=0.000000

          [- 0]原=1.000000

    它们的真值含义相同。

    <2>对于小数原码,表示范围:-1<x<1;对于整数原码,表示范围:-2^n<X<2^n

    <3>符号位不是数值的一部分,是人为地约定“0正1负”。所以在原码运算中需将符号位与有效数值部分分开处理,也就是取数的绝对值进行运算(又称为无符号数运算),而把符号位单独处理。

    <4>在补码中,数值0只有一种表示000000。

    <5>负数补码的表示范围比原码稍微大一点,多一个组合。原码负数绝对值最大为-(2^n-1),补码表示中的绝对值最大负数是-2^n。其代码序列是100000.

    (3)反码表示法

    正数的与原码相同:负数反码的符号位为1,尾数由原码尾数逐位变反。

    4.定点数

    在计算机中,小数点位置固定不变的数叫做定点数。

    (1)无符号定点整数

    无符号定点整数由于没有符号位,全部数位都被用来表示数值,因此它的表示范围比带符号定点整数更大,且它的小数点隐含在最低位之后,在数码序列中并不存在。

    对于某一种数的表示方法,有两项指标(XnXn-1.....X1X0)[分辨率表明了这种表示方法的绝对精度]:

    典型值                真值               代码序列

    最大正数          2^n+1-1          11111111

    (分辨率)最小非零整数           1             00000001

    (2)带符号定点整数

    原码定点整数表示范围:-(2^n -1)~(2^n -1)

    补码定点整数表示范围:-2^n~2^n-1

    原码、补码定点整数分辨率:1

    (3)带符号定点小数

    原码:-(1-2^-n)~(1-2^n)

    补码:-1~(1-2^-n)

    分辨率:2^-n

    如果某个数据既有整数又有小数,要把它规范成某种定点数,就需要在程序中设置比例因子,才能将它缩小为定点小数或扩大为定点整数。运算后,再根据比例因子与实际经历的运算操作,将所得到的运算结果还原为实际值。

    定点数的表示范围有限,如果运算结果超出表示范围,称为溢出。大于最大正数,称为正溢。沿负的方向超出绝对值最大负数(或描述为小于定点数的最小值),称为负溢。如果比例因子选择不当,如在变为定点小数的时候缩小比例不足,运算就可能产生溢出。因此,计算机硬件应具有溢出判断功能,一旦产生溢出就可以立即转入溢出处理,调整比例因子。反之,在设置比例因子时,如果缩小比例过大,将会降低精度。

    5.浮点数

    (1)浮点数的表示形式(原理性)

    先将数写成一种比例因子与尾数相乘的形式,而且比例因子采用指数形态。

    N=+/-R^E*M.

    式中,N为真值,R^E为比例因子,M是尾数。对于某种浮点格式,R固定不变且隐含约定,因此浮点数代码序列中只需分别给出E和M这两部分。

    E是阶码,也就是比例因子R^E的指数值,为带符号定点整数,可用补码或移码表示。

    若阶码为正值,则表明尾数M将被扩大若干倍;反之,表明尾数M将被缩小若干倍。

    R是阶码的底数,与尾数M的基数相同。【对于某一种浮点数格式,R隐含约定】

    M是尾数,是一个带符号的定点原码或补码小数。

    为了充分利用尾数部分的有效位数,使表示精度尽可能高,以及确保任何一个数用浮点数形式表示时其尾数的代码表示具有唯一性,故一般都对尾数M有规格化要求:1/2<=|M|<1.

    原码:最高有效位为1;补码:数符位+最高有效位=1

    PS:-1/2对于补码而言,不是规格化尾数

    6.移码

    若用移码表示的浮点数阶码共用m+1位,其代码序列:XmXm-1.....X1X0,则:

    X移=2^m+X;-2^m<=X<2^m

    X是阶码的真值,2^m是数字位Xm的位权。X移相当于将真值X沿数轴正向平移2^m,所以形象地讲其称为移码。

    PS:浮点数 分辨率:min(|M|)*R^(min.E)

    7.IEEE754标准浮点格式

    最高位S0是数符,其后是8位的阶码,以2为底,采用移码表示,但偏置量为127。

    同时隐含约定尾数的最高数位为2^0,相当于尾数有24位。尾数真值=1+M

    31   | 30       23 | 22       0

    S0   |    阶码     |     尾数

    要求用原码表示的尾数M必须满足0<=|M|<1(规格化要求)。

    特殊情况:

    1.阶码全为0,且尾数为0,浮点数F=0;

    2.阶码各位全为0,尾数不是,F按非正规浮点数解码:阶码E的真值被解析为-126,M被解析为尾数实际值,不加1.

    3.阶码E各位全为1且尾数M的各位全为0,浮点数=+00

    4.阶码E各位全为1且尾数M的各位并不全为0时,F无效。

    数值型数据涉及:进位制、带符号数、小数点:

    某小数是定点小数,补码表示,二进制数。

    浮点数:由两个定点数组成;阶码(补码)+尾数(补码);IEEE754则是:移码+原码(少一个绝对值1)

    展开全文
  • 数值型数据的运算

    千次阅读 2019-11-02 16:36:56
    一般情况下,数据在存储器中仍保持单符号位,在将补码送入加法器进行运算之前,再扩充为两位符号位,运算结果也是变形补码形式。然后再将结果去掉一位符号位,变成普通补码形式存入存储器。使用变形补码的双符号位的...

    定点加法与减法运算

    上节内容介绍过,带符号数有原码、反码、补码等几种表示方法,并且为了降低运算器的复杂性,我们可以把减法看作被减数加减数的负数,即

    A-B=A+(-B)

    这样减法操作就可以用加法操作来代替,运算器只需要设置加法器即可,无须再设置减法器。此外,由于原码加法运算复杂,还需要考虑双方操作数的符号位。而计算机中的有模运算A+(-B)中的-B可以用它的补码来代替,实现相对简单,运算过程中无须再额外考虑符号位。因而现代计算机中都采用补码做加减运算。

    1.补码加减运算

    运算器中补码加减的基本公式如下:

    [A+B]补=[A]补+[B]补

    [A-B]补=[A+(-B)]补=[A]补+[-B]补

    公式表明,当作加减运算时,可直接将补码表示的两个操作数[A]补和[B]补相加。只要结果不超出机器字长所能表示的数值范围,符号位可与数值位等同处理。如果符号位在运算过程中产生向上进位,根据前面讲述补码时关于有模运算的概念可知,运算器会自动舍去,不会影响结果的正确性。当然,也可能由于加减运算的结果超出了机器字长所能表示的范围而产生错误(称为溢出)的情况。

    【例】已知十进制数A=+18,B=+23.设机器字长为8位,用补码加减计算[A+B]补并还原成真值。

    使用二进制表示:

    A=+10010,B=+10111

    求A和B的原码,得

    [A]原=00010010,[B]原=00010111

    求A和B的补码,得

    [A]补=00010010,[B]补=00010111

    根据补码加减公式,得

    [A+B]补=[A]补+[B]补=00010010+00010111,结果为:

    [A+B]补=00101001

    [A+B]原=00101001

    A+B=(41)10进制

    【例】已知十进制数A=-10,B=-2.设机器字长为5位,用补码加减法计算[A+B]补并还原成真值。

    使用二进制形式表示:

    A=-1010,B=-0010

    求A和B的原码,得

    [A]原=11010,[B]原=10010

    求A和B的补码,得

    [A]补=10110,[B]补=11110

    根据补码加减公式,得

    [A+B]补=[A]补+[B]补=10110+11110=110100(机器字长为5,故最高位溢出丢弃)

    故[A+B]补=10100                     补码的补码即为原码

    [A+B]原=11100

    A+B=-12

    【例】已知二进制纯小数A=+0.1001,B=+0.0101.设机器字长为5位,使用补码加减法计算[A+B]补并还原成真值。

    求A和B的原码,得

    [A]原=0.1001,[B]原=0.0101(实际编码不存在小数点)

    求A和B的补码,得

    [A]补=0.1001,[B]补=0.0101

    根据补码加减公式,得

    [A+B]补=[A]补+[B]补=0.1001+0.0101=0.1110

    A+B=0.1110

    当作减法操作A-B时,经过公式推导可知:只需先求出[-B]补,就可以按照加法规则[A-B]补=[A]补+[-B]补进行运算。

    【例】已知二进制纯小数A=+0.1001,B=+0.0101.设机器字长为5位,使用补码加减法计算[A-B]补并还原成真值。

    -B=-0.0101

    [A]原=0.1001,[-B]原=1.0101

    [A]补=0.1001,[-B]补=1.1011

    根据补码加减公式,得

    [A-B]补=[A]补+[-B]补=0.1001+1.1011=10.0111(最高位1溢出丢弃)

    即 [A-B]补=0.0100                            A-B=(0.01)2进制

    【例】已知十进制数A=-71,B=+43.设机器数字长为8位。用补码加减法计算[A-B]补并还原成真值。

    使用二进制形式表示:

    A=-1000111,-B=-101011

    求A和B的原码,得

    [A]原=11000111,[-B]原=10101011

    求A和B的补码,得

    [A]补=10111001,[-B]补=11010101

    根据补码加减公式,得

    [A-B]补=[A]补+[-B]补=10111001+11010101=110001110(最高位1溢出丢弃)

    即[A-B]补=10001110 

    [A-B]原=11110010

    A-B=-114

    2.溢出判断

    前面的例题的正确实际上都还要有一个共同的前提:运算结果没有超出机器字长所能表示的数值范围。我们知道,计算机运算器中进行的都是有模运算,机器字长所能表示的数值范围有限。所以,必须考虑运算结果是否超出机器数所能表示的范围。

    【例】已知十进制数A=+71,B=+63.设机器数字长为8位。用补码加减法计算[A+B]补并还原成真值。

    使用二进制形式表示:

    A=+1000111,B=+111111

    求A和B的原码,得

    [A]原=01000111,[B]原=00111111

    求A和B的补码,得

    [A]补=01000111,[B]补=00111111

    根据补码加减公式,得

    [A+B]补=[A]补+[B]补=01000111+00111111=10000110

    为[A+B]补=10000110

    [A+B]原=11111010

    A+B=-122

    得到还原后的真值发现很明显的错误:两个正数相加,结果却为负数。这是因为8位有符号定点整数的取值范围为-128~+127,而上例中的A+B的数学运算结果应为134,已经超出了取值范围。在计算机中,这种由于运算结果超出机器数所能表示的范围而导致的错误现象称为溢出。下面我们来分析一下,什么时候可能会产生溢出,运算器中如何判断一个运算结果是否溢出。

    首先,简单分析不难发现,两个不同符号的数相加或两个相同符号的数相减,由于结果的绝对值一定会小于其中一个或两个操作数的绝对值,所以结果一定不会出现溢出。只有符号不同的两个数相减或符号相同的两个数相加,结果的绝对值一定会大于两个操作数的绝对值,才有可能出现溢出。

    下面我们以机器字长为5位的有符号数的加减为例,通过多个实例的分析,寻找溢出发生的规律,从而找到判断溢出的方法。

    【例】5+4=9(未溢出)

    转换为补码进行计算,得

    00101+00100=01001

    【例】12+7=19(溢出)  下列均为补码运算

    01100+00111=10011

    【例】-10+(-2)=-12(未溢出)

    10110+11110=110100——10100(丢弃最高位)

    【例】-10+(-8)=-18(溢出)

    10110+11000=101110——01110

    【例】-5-12=-5+(-12)=-17(溢出)

    11011+10100=101111——01111

    【例】10-5=10+(-5)=5(未溢出)

    01010+11011=100101——00101

    【例】-10-(-5)=-10+5=-5(未溢出)

    10110+00101=11011

    从上面可以看出,机器字长为5位的有符号定点整数的取值范围为-16~15(即-2^n~2^n  -1),数值运算的结果超出这个范围的即溢出。

    (1)溢出判断方法一。不论是减法运算还是加法运算,在计算机中是通过补码变换,使用加法器进行两个补码的加法运算来实现的。只要同时满足下面两个条件,即为溢出:

    第一,加法器中实际参加加法运算的两个补码符号位相同;

    第二,加法器输出结果与这两个操作数的符号不同。

    设加法器中实际参加加法运算的两个补码符号位分别为SA和SB,加法器输出结果为Sr,那么判断溢出的逻辑表达式为:

    V=`SA`SBSr+SASB`Sr

    【例】设二进制小数A=-0.1011,B=-0.0111.使用溢出判断方法一判断定点小数的运算:A+B的结果是否溢出。

    求A和B的原码,得

    [A]原=1.1011,[B]原=1.0111

    计算操作数的补码,得

    [A]补=1.0101,[B]补=1.1001

    [A+B]补=[A]补+[B]补=1.0101+1.1001=10.1110——0.1110

    参与加法运算的两个补码:1.0101和1.1001的符号位相同,均为1,而补码加法后的结果0.1110的符号位为0,与操作数的符号不同。据此判断,A+B的结果溢出。

    【例】设二进制纯小数A+0.1001,B=+0.0101.使用溢出判断方法一判断定点小数的运算:A+B的结果是否溢出。

    求A和B的原码,得

    [A]原=0.1001,[B]原=0.0101

    求A和B的补码,得

    [A]补=0.1001,[B]补=0.0101

    根据补码加减公式,得

    [A+B]补=[A]补+[B]补=0.1001+0.0101=0.1110

    参与加法运算的两个补码:0.1001和0.0101的符号位相同,均为0,而补码加法后的结果0.1110的符号位为0,与操作数的符号相同。据此判断,A+B的结果未溢出。

    (2)溢出判断方法二。除了方法一,还可以从两个进位信号之间的关系中找到规律:分别为符号位产生的进位Cf和最高有效位(符号位右边第一位)产生的进位C。当符号位和最高有效数值位均产生进位,或均不产生进位时,补码加法运算没有出现溢出;而当符号位和最高有效位中只有一个产生进位,而另一个没有产生进位时,运算结果溢出。所以我们总结出第二个判断溢出的逻辑表达式为:

    V=Cf异或C

    (3)溢出判断方法三。第三种方法相对简单,但需要对补码的编码方式稍作改变,这种编码方式称为变形补码:相对普通的补码,变形补码还需要一个额外的一个符号位,两个符号位的取值相同,分别位于机器数编码的最高位和次高位,也称双符号位。例如,一个机器数字长为5位的补码为:01001,它的变形补码的编码为001001,当然,这是加法器中的寄存器字长也需要扩充一位,即6位。再如,当补码为10101101时,对应的变形补码的编码为:110101101.设真值A的变形补码用[A]补`来表示,使用变形补码进行定点数的加减运算时,其公式和使用普通补码进行加减运算的公式相似:

    [A+B]补`=[A]补`+[B]补`

    [A-B]补`=[A+(-B)]补`=[A]补`+[-B]补`

    一般情况下,数据在存储器中仍保持单符号位,在将补码送入加法器进行运算之前,再扩充为两位符号位,运算结果也是变形补码形式。然后再将结果去掉一位符号位,变成普通补码形式存入存储器。使用变形补码的双符号位的作用就是判断运算结果是否溢出的。

    下面我们以6位字长的变形补码的加减为例,分析并找出判断溢出的方法:

    【例】5+4=9(未溢出)

    000101+000100=001001

    【例】12+7=19(溢出)

    001100+000111=010011

    【例】6-(-9)=6+9=15(未溢出)

    000110+001001=001111

    【例】5-(-11)=5+11=16(溢出)

    000101+001011=010000

    【例】-5-10=-5+(-10)=-15(未溢出)

    111011+110110=1110001——110001

    【例】-5-12=-5+(-12)=-17(溢出)

    111011+110100=1101111——101111

    【例】10-5=10+(-5)=5(未溢出)

    001010+111011=1000101——000101

    【例】-10-(-5)=-10+5=-5(未溢出)

    110110+000101=111011

    观察运算结果发现,变形补码加法的结果的两位符号位如果不相等,表示计算结果出现溢出。当结果的两位符号位相等,则表现未出现溢出。此时将结果去掉一位符号位,结果被还原成普通补码形式。所以,设变形补码加法运算后的结果第一位符号位和第二位符号位分别用Sf1和Sf2表示,则第三个判断溢出的逻辑表达式为:

    V=Sf1异或Sf2

    【例】设二进制纯小数A=0.1001,B=0.1101,使用溢出判断方法三判断定点小数的运算A+B的结果是否溢出

    求A和B的原码,得

    [A]原=0.1001,[B]原=0.1101

    求A和B的变形补码,得

    [A]补`=00.1001,[B]补`=00.1101

    [A+B]补`=[A]补`+[B]补`=00.1001+00.1101=01.0110

    变形补码运算结果为:01.0110,两个符号位不一致,可以判定,运算结果溢出。

    定点乘法运算

    计算机中,乘法运算是非常常用的一种运算,但是由于计算机中实现乘法运算比实现加减法运算要复杂很多,也有一些简单的CPU内不设置乘法器,乘法的实现是按照乘法器做乘法运算的流程,以加法器为基础,用软件编程的方式实现的。下面我们就来讨论乘法运算在计算机中的实现步骤。

    定点乘法运算的实现方法很多,难易程度也不同。我们以原码1位乘运算为例,介绍计算机中实现定点乘法的基本思想和方法。

    (1)符号位。首先是符号位的确定。与定点数的补码加减法运算不同,乘法运算的符号位无法通过转换补码,加入到乘法运算中,必须单独进行处理。根据乘法运算规则:同号相乘为正、异号相乘为负。设两个定点数分别为X和Y,Xf和Yf分别代表定点数X和Y的符号位,乘法运算结果为Z,Zf代表Z的符号位结果。如下所示(0正1负)

    乘法运算符号位结果真值表
    XfYfZf
    000
    011
    101
    110

     

    根据真值表,可得乘法运算符号位的逻辑表达式为:

    Zf=Xf异或Yf

    (2)数值部分乘法。然后,除去符号位,再单独考虑被乘数和乘数的绝对值的乘法运算。原码一位乘法的方法是从笔算乘法演变而来的,我们先看一个乘法运算笔算式子的完整过程。

    【例】设二进制纯小数X=0.1101,Y=0.1011,计算X*Y

                                     0  .  1  1  0  1

                              ×     0  .  1  0  1  1

    ------------------------------------------------------

           0   .     0    0    0  0    1  1   0   1……………………X*2^-4   X右移4位

          0     .     0  0      0 1    1  0   1    ……………………X*2^-3   X右移3位

           0    .     0  0      0 0    0  0         ……………………X*0

           0    .     0  1      1 0    1             ……………………X*2^-1   X右移1位

    ------------------------------------------------------

           0.         1  0      0  0   1  1   1    1  

    结果为:X*Y=0.10001111

    根据上面的例子可得,二进制数的乘法X*Y的绝对值计算方法为:查看乘数Y的各位上的值,当为0时,记中间结果0;当为1时,记中间结果为X右移相应位数。然后将中间结果累加起来。

    我们可以根据这种方式,以移位器和加法器为基础,或者编写程序代码,实现乘法运算。但是直接使用笔算乘法的方式,计算机需要更多额外的寄存器来存放这些中间结果。而且每一个中间结果的位数都比被乘数和乘数增加一倍,实现起来效率不高。所以,我们对上例的笔算乘法稍作一些改进,使其更方便地在计算机中实现(若X或Y为负数,则要取绝对值):

    |X*Y|=X*0.1011

            =0.1X+0.001X+0.0001X

            =0.1X+0X+0.001(X+0.1X)

            =0.1X+0.01(0X+0.1(X+0.1X))

            =0.1(X+0.1(0X+0.1(X+0.1X)))

            =2^-1(X+2^-1(0X+2^-1(X+2^-1X)))

            =2^-1(X+2^-1(0X+2^-1(X+2^-1(X+0))))

    被乘数乘以2^-1相当于乘数右移一位。观察上式,可以发现,计算X*Y的绝对值的操作,被表示成了一个先相加再右移的递归操作。这无论对于使用硬件方式进行乘法操作,还是对于软件编程方式进行乘法操作,都是非常容易实现的。下面我们分部计算上例的乘法:

    ①计算X+0,得中间结果0.1101;

    ②中间结果右移一位,得中间结果0.01101;

    ③上步的中间结果+1X,得中间结果1.00111;

    ④上步的中间结果右移一位,得中间结果0.100111;

    ⑤上步的中间结果+0X,得中间结果0.100111;

    ⑥上步的中间结果右移一位,得中间结果0.0100111;

    ⑦上步的中间结果+1X,得中间结果1.0001111;

    ⑧上步的中间结果右移一位,得最终结果0.10001111.

    这样,乘法运算被分解为了简单的加法操作和移位操作。总结一下,设Y=0.Y1Y2……Yn,X^*为被乘数X的数值部分。对公式进行分步求解,可以得出二进制乘法操作的分步操作,步骤如下所示:

    Z0=0

    Z1=2^-1(Z0+X*Yn)

    Z2=2^-1(Z1+X*Yn-1)

    ………………

    Zi=2^1(Z(i-1)+X*Y(n-i+1))

    ………………

    Zn=2^-1(Z(n-1)+X*Y1)

    每个步骤中产生的这些中间结果:Z0,Z1,Z2,……Zn-1,我们称之为部分积。最后的Zn即为X*Y的结果Z的绝对值。

    再加上上面讲到的符号位的处理,可得出原码一位乘法的完整算法如下:

    ①将被乘数和乘数的符号位进行异或操作:Zf=Xf异或Yf,得到结果的符号位。然后使用被乘数和乘数的数值部分进行计算,计算结果的绝对值。

    ②设部分积Z0位0.

    ③以乘数的最低位作为乘法的判别位,若判别位为1,则在部分积上加上被乘数,结果右移一位,若判别位为0,则在部分积上加0,结果右移一位。如此形成新的部分积。

    ④乘数右移一位。

    ⑤重复执行第三步和第四步,共执行n次,n为乘数数值部分长度。最后得到的部分积结果就是乘法结果的绝对值部分。

    ⑥将乘法操作的符号位和绝对值部分结合起来,得到乘法操作的最终结果。

    【例】设二进制存小数X=-0.1001,Y=0.1010,试使用原码一位乘法计算X*Y,并写出详细的运算步骤。

    求X和Y的原码

    [X]原=1.1001,[Y]原=0.1010

    首先计算符号位,Xf=1,Yf=0,得

    Zf=Xf异或Yf=1异或0=1

    被乘数X的数值部分为X*=0.1001,乘数为0.1010.按照原码一位乘法运算步骤如下:

    ①部分积Z0=0,乘数为0.1010;

    ②乘数最低位为0,Z0+0=0,结果右移一位,得Z1=0;

    ③乘数右移一位,得0.0101;

    ④乘数最低位为1,Z1+X*=0.1001,结果右移一位,得Z2=0.01001;

    ⑤乘数右移一位,得0.0010;

    ⑥乘数最低位为0,Z2+0=0.01001,结果右移一位,得Z3=0.001001;

    ⑦乘数右移一位,得0.0001;

    ⑧乘数最低位为1,Z3+X*=0.101101,结果右移一位,得Z4=0.0101101.即X*Y的绝对值为:0.0101101.

    符号位与绝对值部分结合,得最终结果:

    [Z]原=1.0101101

    Z=-0.0101101

     

    展开全文
  • 什么是数据结构?

    千次阅读 2019-06-19 20:25:39
    什么是数据结构?数据结构是什么? 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据...

    什么是数据结构?数据结构是什么?

     

    数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

     

    定义

    名词定义

    数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。也就是说,数组结构指的是数据集合及数据之间关系的集合,是两个集合。

    记为:Data_Structure=(D,R)

    其中D是数据元素的集合,R是该集合中所有元素之间的关系的有限集合。 

    数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。

     

    其它定义

    Sartaj Sahni在他的《数据结构、算法与应用》一书中称:“数据结构是数据对象,以及存在于该对象的实例和组成实 例的数据元素之间的各种联系。这些联系可以通过定义相关的函数来给出。”他将数据对象(data object)定义为“一个数据对象是实例或值的集合”。
    Clifford A.Shaffer在《数据结构与算法分析》一书中的定义是:“数据结构是ADT(抽象数据类型Abstract Data Type) 的物理实现。”
    Robert L.Kruse在《数据结构与程序设计》一书中,将一个数据结构的设计过程分成抽象层、数据结构层和实现层。其中,抽象层是指抽象数据类型层,它讨论数据的逻辑结构及其运算,数据结构层和实现层讨论一个数据结构的表示和在计算机内的存储细节以及运算的实现。
    数据结构具体指同一类数据元素中,各元素之间的相互关系,包括三个组成成分,数据的逻辑结构,数据的存储结构和数据运算结构。

     

    研究对象

    一、数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关。逻辑结构包括:
    集合
    数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;
    2.线性结构
    数据结构中的元素存在一对一的相互关系;
    3.树形结构
    数据结构中的元素存在一对多的相互关系;
    4.图形结构
    数据结构中的元素存在多对多的相互关系。
    二、数据的物理结构:指数据的逻辑结构在计算机存储空间的存放形式。 
    数据的物理结构是数据结构在计算机中的表示(又称映像),它包括数据元素的机内表示和关系的机内表示。由于具体实现的方法有顺序、链接、索引、散列等多种,所以,一种数据结构可表示成一种或多种存储结构。
    数据元素的机内表示(映像方法): 用二进制位(bit)的位串表示数据元素。通常称这种位串为节点(node)。当数据元素有若干个数据项组成时,位串中与个数据项对应的子位串称为数据域(data field)。因此,节点是数据元素的机内表示(或机内映像)。
    关系的机内表示(映像方法):数据元素之间的关系的机内表示可以分为顺序映像和非顺序映像,常用两种存储结构:顺序存储结构和链式存储结构。顺序映像借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。非顺序映像借助指示元素存储位置的指针(pointer)来表示数据元素之间的逻辑关系。
    三、数据结构的运算。

     

    重要意义

              一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。一个逻辑数据结构可以有多种存储结构,且各种存储结构影响数据处理的效率。

             在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。

             选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。

     

    研究内容

             在计算机科学中,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象(数据元素)以及它们之间的关系和运算等的学科,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。

             “数据结构”作为一门独立的课程在国外是从1968年才开始设立的。 1968年美国唐纳德·克努特(Donald Ervin Knuth)教授开创了数据结构的最初体系,他所著的《计算机程序设计艺术》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。“数据结构”在计算机科学中是一门综合性的专业基础课,数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。数据结构这一门课的内容不仅是一般程序设计(特别是非数值性程序设计)的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序的重要基础。

             计算机科学是一门研究用计算机进行信息表示和处理的科学。这里面涉及到两个问题:信息的表示,信息的处理 。

             而信息的表示和组织又直接关系到处理信息的程序的效率。随着计算机的普及,信息量的增加,信息范围的拓宽,使许多系统程序和应用程序的规模很大,结构又相当复杂。因此,为了编写出一个“好”的程序,必须分析待处理的对象的特征及各对象之间存在的关系,这就是数据结构这门课所要研究的问题。众所周知,计算机的程序是对信息进行加工处理。在大多数情况下,这些信息并不是没有组织,信息(数据)之间往往具有重要的结构关系,这就是数据结构的内容。数据的结构,直接影响算法的选择和效率。

             计算机解决一个具体问题时,大致需要经过下列几个步骤:首先要从具体问题中抽象出一个适当的数学模型,然后设计一个解此数学模型的算法(Algorithm),最后编出程序、进行测试、调整直至得到最终解答。

             寻求数学模型的实质是分析问题,从中提取操作的对象,并找出这些操作对象之间含有的关系,然后用数学的语言加以描述。当人们用计算机处理数值计算问题时,所用的数学模型是用数学方程描述。所涉及的运算对象一般是简单的整形、实型和逻辑型数据,因此程序设计者的主要精力集中于程序设计技巧上,而不是数据的存储和组织上。然而,计算机应用的更多领域是“非数值型计算问题”,它们的数学模型无法用数学方程描述,而是用数据结构描述,解决此类问题的关键是设计出合适的数据结构,描述非数值型问题的数学模型是用线性表、树、图等结构来描述的。

             计算机算法与数据的结构密切相关,算法无不依附于具体的数据结构,数据结构直接关系到算法的选择和效率。运算是由计算机来完成,这就要设计相应的插入、删除和修改的算法 。也就是说,数据结构还需要给出每种结构类型所定义的各种运算的算法。

             数据是信息的载体,是可以被计算机识别存储并加工处理的描述客观事物的信息符号的总称。所有能被输入计算机中,且能被计算机处理的符号的集合,它是计算机程序加工处理的对象。客观事物包括数值、字符、声音、图形、图像等,它们本身并不是数据,只有通过编码变成能被计算机识别、存储和处理的符号形式后才是数据。

             数据元素是数据的基本单位,在计算机程序中通常作为一个整体考虑。一个数据元素由若干个数据项组成。数据项是数据结构中讨论的最小单位。有两类数据元素:若数据元素可再分,则每一个独立的处理单元就是数据项,数据元素是数据项的集合;若数据元素不可再分,则数据元素和数据项是同一概念,如:整数"5",字符 "N" 等。例如描述一个学生的信息的数据元素可由下列6个数据项组成。其中的出生日期又可以由三个数据项:"年"、"月"和"日"组成,则称"出生日期"为组合项,而其它不可分割的数据项为原子项。

             关键字指的是能识别一个或多个数据元素的数据项。若能起唯一识别作用,则称之为 "主" 关键字,否则称之为 "次" 关键字。

             数据对象是性质相同的数据元素的集合,是数据的一个子集。数据对象可以是有限的,也可以是无限的。

             数据处理是指对数据进行查找、插入、删除、合并、排序、统计以及简单计算等的操作过程。在早期,计算机主要用于科学和工程计算,进入八十年代以后,计算机主要用于数据处理。据有关统计资料表明,计算机用于数据处理的时间比例达到80%以上,随着时间的推移和计算机应用的进一步普及,计算机用于数据处理的时间比例必将进一步增大。

     

    结构分类

             数据结构是指同一数据元素类中各数据元素之间存在的关系。数据结构分别为逻辑结构、存储结构(物理结构)和数据的运算。数据的逻辑结构是从具体问题抽象出来的数学模型,是描述数据元素及其关系的数学特性的,有时就把逻辑结构简称为数据结构。逻辑结构是在计算机存储中的映像,形式地定义为(K,R)(或(D,S)),其中,K是数据元素的有限集,R是K上的关系的有限集。

             根据数据元素间关系的不同特性,通常有下列四类基本的结构: ⑴集合结构。该结构的数据元素间的关系是“属于同一个集合”。 ⑵线性结构。该结构的数据元素之间存在着一对一的关系。 ⑶树型结构。该结构的数据元素之间存在着一对多的关系。 ⑷图形结构。该结构的数据元素之间存在着多对多的关系,也称网状结构。 从上面所介绍的数据结构的概念中可以知道,一个数据结构有两个要素。一个是数据元素的集合,另一个是关系的集合。在形式上,数据结构通常可以采用一个二元组来表示。

             数据结构的形式定义为:数据结构是一个二元组 :Data_Structure=(D,R),其中,D是数据元素的有限集,R是D上关系的有限集。线性结构的特点是数据元素之间是一种线性关系,数据元素“一个接一个的排列”。在一个线性表中数据元素的类型是相同的,或者说线性表是由同一类型的数据元素构成的线性结构。在实际问题中线性表的例子是很多的,如学生情况信息表是一个线性表:表中数据元素的类型为学生类型; 一个字符串也是一个线性表:表中数据元素的类型为字符型,等等。

             线性表是最简单、最基本、也是最常用的一种线性结构。 线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列,通常记为: (a1,a2,… ai-1,ai,ai+1,…an) ,其中n为表长, n=0 时称为空表。 它有两种存储方法:顺序存储和链式存储,它的主要基本操作是插入、删除和检索等。

             数据结构在计算机中的表示(映像)称为数据的物理(存储)结构。它包括数据元素的表示和关系的表示。数据元素之间的关系有两种不同的表示方法:顺序映象和非顺序映象,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。

             顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现,由此得到的存储表示称为顺序存储结构。顺序存储结构是一种最基本的存储表示方法,通常借助于程序设计语言中的数组来实现。

             链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构,链式存储结构通常借助于程序设计语言中的指针类型来实现

             索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。

             散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。

             数据结构中,逻辑上(逻辑结构:数据元素之间的逻辑关系)可以把数据结构分成线性结构和非线性结构。线性结构的顺序存储结构是一种顺序存取的存储结构,线性表的链式存储结构是一种随机存取的存储结构。线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。逻辑结构与数据元素本身的形式、内容、相对位置、所含结点个数都无关。

     

    结构算法

             算法的设计取决于数据(逻辑)结构,而算法的实现依赖于采用的存储结构。数据的存储结构实质上是它的逻辑结构在计算机存储器中的实现,为了全面的反映一个数据的逻辑结构,它在存储器中的映象包括两方面内容,即数据元素之间的信息和数据元素之间的关系。不同数据结构有其相应的若干运算。数据的运算是在数据的逻辑结构上定义的操作算法,如检索、插入、删除、更新和排序等。

             数据的运算是数据结构的一个重要方面,讨论任一种数据结构时都离不开对该结构上的数据运算及其实现算法的讨论。
    数据结构不同于数据类型,也不同于数据对象,它不仅要描述数据类型的数据对象,而且要描述数据对象各元素之间的相互关系。

             数据类型是一个值的集合和定义在这个值集上的一组操作的总称。数据类型可分为两类:原子类型、结构类型。一方面,在程序设计语言中,每一个数据都属于某种数据类型。类型明显或隐含地规定了数据的取值范围、存储方式以及允许进行的运算。可以认为,数据类型是在程序设计中已经实现了的数据结构。另一方面,在程序设计过程中,当需要引入某种新的数据结构时,总是借助编程语言所提供的数据类型来描述数据的存储结构。

             计算机中表示数据的最小单位是二进制数的一位,叫做位。我们用一个由若干位组合起来形成的一个位串表示一个数据元素,通常称这个位串为元素或结点。当数据元素由若干数据项组成时,位串中对应于各个数据项的子位串称为数据域。元素或结点可看成是数据元素在计算机中的映象。

             一个软件系统框架应建立在数据之上,而不是建立在操作之上。一个含抽象数据类型的软件模块应包含定义、表示、实现三个部分。
    对每一个数据结构而言,必定存在与它密切相关的一组操作。若操作的种类和数目不同,即使逻辑结构相同,数据结构能起的作用也不同。

             不同的数据结构其操作集不同,但下列操作必不可缺:
             1,结构的生成;
             2.结构的销毁;
             3,在结构中查找满足规定条件的数据元素;
             4,在结构中插入新的数据元素;
             5,删除结构中已经存在的数据元素;
             6,遍历。

             抽象数据类型:一个数学模型以及定义在该模型上的一组操作。抽象数据类型实际上就是对该数据结构的定义。因为它定义了一个数据的逻辑结构以及在此结构上的一组算法。抽象数据类型可用以下三元组表示:(D,S,P)。D是数据对象,S是D上的关系集,P是对D的基本操作集。ADT的定义为:

             ADT 抽象数据类型名:{数据对象:(数据元素集合),数据关系:(数据关系二元组结合),基本操作:(操作函数的罗列)}; ADT抽象数据类型名;抽象数据类型有两个重要特性:

             数据抽象

             用ADT描述程序处理的实体时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。

             数据封装

             将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。

             数据(Data)是信息的载体,它能够被计算机识别、存储和加工处理。它是计算机程序加工的原料,应用程序处理各种各样的数据。计算机科学中,所谓数据就是计算机加工处理的对象,它可以是数值数据,也可以是非数值数据。数值数据是一些整数、实数或复数,主要用于工程计算、科学计算和商务处理等;非数值数据包括字符、文字、图形、图像、语音等。数据元素(Data Element)是数据的基本单位。在不同的条件下,数据元素又可称为元素、结点、顶点、记录等。例如,学生信息检索系统中学生信息表中的一个记录等,都被称为一个数据元素。
    有时,一个数据元素可由若干个数据项(Data Item)组成,例如,学籍管理系统中学生信息表的每一个数据元素就是一个学生记录。它包括学生的学号、姓名、性别、籍贯、出生年月、成绩等数据项。这些数据项可以分为两种:一种叫做初等项,如学生的性别、籍贯等,这些数据项是在数据处理时不能再分割的最小单位;另一种叫做组合项,如学生的成绩,它可以再划分为数学、物理、化学等更小的项。通常,在解决实际应用问题时是把每个学生记录当作一个基本单位进行访问和处理的。

             数据对象(Data Object)或数据元素类(Data Element Class)是具有相同性质的数据元素的集合。在某个具体问题中,数据元素都具有相同的性质(元素值不一定相等),属于同一数据对象(数据元素类),数据元素是数据元素类的一个实例。例如,在交通咨询系统的交通网中,所有的顶点是一个数据元素类,顶点A和顶点B各自代表一个城市,是该数据元素类中的两个实例,其数据元素的值分别为A和B。 数据结构(Data Structure)是指互相之间存在着一种或多种关系的数据元素的集合。在任何问题中,数据元素之间都不会是孤立的,在它们之间都存在着这样或那样的关系,这种数据元素之间的关系称为结构。

     

    常用结构

    数组
             在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。


             是只能在某一端插入和删除的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。

    队列
             一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列是按照“先进先出”或“后进后出”的原则组织数据的。队列中没有元素时,称为空队列。

    链表
             是一种物理存储单元上非连续、非顺序的存储结构,它既可以表示线性结构,也可以用于表示非线性结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。


             是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足 以下条件:
             (1)有且仅有一个结点 K0,他对于关系N来说没有前驱,称K0为树的根结点。简称为根(root)。  
             (2)除K0外,K中的每个结点,对于关系N来说有且仅有一个前驱。
             (3)K中各结点,对关系N来说可以有m个后继(m>=0)。


             图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。


             在计算机科学中,堆是一种特殊的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。

    散列表
             若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。

     

    简而言之,数据结构说的是:计算机组织数据和存储数据的方式。

    展开全文
  • 编码规则:一个二进制数,用0-1代码表示符号,数值位不变就得到与该二进制数真值对应的原码 例如真值为 +1100 (十进制为12)的原码为 0 1100 , -1100 的原码为 1 1100 字长为8的原码的表示范围为 -127~+127 ...

    1.进位计数制

    1.1 数制的基与权

    在任意数制中,每个数位上允许使用的记数符号的个数被称为该数制的基数
    每1位都对应1个表示该位在数码中的位置的值,这个值就称为数位的权值w

    1.2常用进制及转换

    计算机中常用的进制

    1. 2进制
    2. 8进制
    3. 16进制

    1.2.1 10进制和任意进制的相互转换

    10进制转成任意进制的方法,例如要转成的进制为x,则方法为除x取余法
    例如:
    10进制转为2进制,为除2取余法,将35转为二进制
    35 / 2 = 17 … … … … 1 35/2=17…………1 35/2=171
    17 / 2 = 8 … … … … 1 17/2=8…………1 17/2=81
    8 / 2 = 4 … … … … 0 8/2=4…………0 8/2=40
    4 / 2 = 2 … … … … 0 4/2=2…………0 4/2=20
    2 / 2 = 1 … … … … 0 2/2=1…………0 2/2=10
    1 / 2 = 0 … … … … 1 1/2=0…………1 1/2=01
    所以35的二进制为10 0011,要注意的是,先计算出来的余数为低位,其实原理如下
    2 ∗ 17 + 1 2*17+1 217+1
    2 ∗ ( 2 ∗ 8 + 1 ) + 1 2*(2*8+1)+1 2(28+1)+1
    2 ∗ ( 2 ∗ ( 2 ∗ 4 + 0 ) + 1 ) + 1 2*(2*(2*4+0)+1)+1 2(2(24+0)+1)+1
    2 ∗ ( 2 ∗ ( 2 ∗ ( 2 ∗ 2 + 0 ) + 0 ) + 1 ) + 1 2*(2*(2*(2*2+0)+0)+1)+1 2(2(2(22+0)+0)+1)+1
    2 ∗ ( 2 ∗ ( 2 ∗ ( 2 ∗ ( 2 ∗ 1 + 0 ) + 0 ) + 0 ) + 1 ) + 1 2*(2*(2*(2*(2*1+0)+0)+0)+1)+1 2(2(2(2(21+0)+0)+0)+1)+1
    2 ∗ ( 2 ∗ ( 2 ∗ ( 2 ∗ ( 2 ∗ ( 2 ∗ 0 + 1 ) + 0 ) + 0 ) + 0 ) + 1 ) + 1 2*(2*(2*(2*(2*(2*0+1)+0)+0)+0)+1)+1 2(2(2(2(2(20+1)+0)+0)+0)+1)+1
    最里层的余数代表最高位,所以最先算出来的余数是最低位,最后算出来的余数是最高位。
    以上是二进制的例子,如果是任意进制如3、5进制也是一样的原理和算法。
    下面附上10进制转2-9,16进制的C语言代码

    #include <stdio.h>
    #include <stdlib.h>
    
    
    void dec2Others(int num,int base)
    {
        char* str="0123456789ABCDEF";
        if(base<2||(base>10&&base!=16))//如果基不对,则退出
        {
            printf("Base Error!");
            return;
        }
        char result[100]={0};
        int i=0;
        while(num)
        {
            result[i++] = str[num%base];
            num/=base;
        }
        for(int j=i-1;j>=0;j--)
        {
            printf("%c",result[j]);
        }
    }
    
    
    int main()
    {
        dec2Others(826725,16);
        return 0;
    }
    
    

    转成10进制就比较简单了,用对应符号数乘上权值即可,例如二进制
    1100 = 0 ∗ 2 0 + 0 ∗ 2 1 + 1 ∗ 2 2 + 1 ∗ 2 3 = 12 1100=0*2^0+0*2^1+1*2^2+1*2^3=12 1100=020+021+122+123=12

    1.2.2 10进制小数和2进制小数相互转换

    乘2取整,例如0.6875转成二进制小数
    0.6875 ∗ 2 = 1.375 … … … … 整 数 为 1 0.6875*2 = 1.375…………整数为1 0.68752=1.3751
    0.375 ∗ 2 = 0.75 … … … … 整 数 为 0 0.375*2 = 0.75…………整数为0 0.3752=0.750
    0.75 ∗ 2 = 1.5 … … … … 整 数 为 1 0.75*2 = 1.5 …………整数为1 0.752=1.51
    0.5 ∗ 2 = 1.0 … … … … 整 数 为 1 0.5*2 = 1.0 …………整数为1 0.52=1.01
    0.6875 = 0.1011 0.6875 = 0.1011 0.6875=0.1011 先计算出来的位为高位

    同样将0.1011转为10进制数
    0.1011 = 1 ∗ 2 − 1 + 0 ∗ 2 − 2 + 1 ∗ 2 − 3 + 1 ∗ 2 − 4 0.1011 = 1*2^{-1} +0*2^{-2}+1*2^{-3}+1*2^{-4} 0.1011=121+022+123+124

    1.2.3 16进制和2进制的相互转换

    可以分组转换,因为4个2进制位正好对应了一个16进制位

    0->00001->00012->00103->0011
    4->01005->01016->01107->0111
    8->10009->1001A->1010B->1011
    C->1100D->1101E->1110F->1111

    例如我们要将101111转为16进制,则4位为一组,不够则在最高位补0
    10 − 1111 = 0010 − 1111 = 2 F 10-1111 = 0010-1111 = 2 F 101111=00101111=2F

    2.数的表示(原码,反码,补码,真值)

    原码,反码,补码都是针对二进制数来说的

    2.1 真值

    一个数可以用各种各样的编码来表示,而这个数的真值代表这个数原本是多少,例如+5用原码表示为0101,则0101的真值为+5

    2.2 带符号数的表示

    0表示整数,1表示负数

    2.2.1 原码

    编码规则:一个二进制数,用0-1代码表示符号,数值位不变就得到与该二进制数真值对应的原码
    例如真值为+1100(十进制为12)的原码为0 1100-1100的原码为1 1100
    字长为8的原码的表示范围为-127~+127

    注意 0 在原码中有两种,表示形式为+0和-0,例如在8位原码中,有1000 00000000 0000两种形式。

    2.2.2 反码

    编码规则:
    1、 若真值为正数,则反码等于原码
    2、 若真值为负数,则反码为 原码的符号位不变,其他位取反
    例如 +1100的原码为0 1100,反码为0 1100-1100的原码为1 1100,反码为1 0011
    字长为8的原码的表示范围为-127~+127

    注意 0 在反码中有也有两种形式,例如在8位原码中,有1111 11110000 0000两种形式。

    2.2.3 补码

    补码的定义 [ x ] 补 = ( x + 2 n ) m o d 2 n [x]_补 = (x +2^n) mod 2^n [x]=(x+2n)mod2nn为编码的位数
    编码规则:
    1、若真值大于等于0,则补码等于原码
    2、若真值为负数,则补码等于,符号为1不变,其余各位按位取反,末位+1
    例如 +1100的原码为0 1100,补码为0 1100-1100的原码为1 1100,补码为1 0100
    字长为8的原码的表示范围为-128~+127
    在补码中不同于原码和反码,补码中没有-0,而表示范围增加了一个负数,这是因为
    ( − 128 + 128 ) m o d 128 = 0 \sout{(-128 +128)mod 128 =0} (128+128)mod128=0
    ( 0 + 128 ) m o d 128 = 0 \sout{(0+128)mod 128 = 0} (0+128)mod128=0

    ( − 128 + 2 8 ) m o d 2 8 = 128 = ( 10000000 ) 2 = [ − 128 ] 补 {(-128 +2^8)mod 2^8 =128=(10000000)_2=[-128]_补} (128+28)mod28=128=(10000000)2=[128]
    ( 0 + 2 8 ) m o d 2 8 = 0 = ( 00000000 ) 2 = [ 0 ] 补 {(0+2^8)mod 2^8 = 0=(00000000)_2=[0]_补} (0+28)mod28=0=(00000000)2=[0]
    1
    而-128为负数所以1000 0000表示为-128 而0000 0000表示为0

    2.2.4 相互转化

    比较重要的就是 原码转为补码,补码转为原码
    原码转补码

    1. 正数不变
    2. 负数,符号位不变,其余各位按位取反,末位+1

    补码转原码

    1. 正数不变
    2. 负数,符号位不变,其余各位按位取反,末位+1

    这里说明一下为什么负数是取反码,末位+1的变法。

    例 如 以 四 位 编 码 举 例 , ( − 5 ) 的 原 码 为 1101 例如以四位编码举例,(-5)的原码为1101 (5)1101
    定 义 : [ X ] 补 = ( X + 2 n ) m o d 2 n 定义:[X]_补 = (X + 2^n)mod 2^n :[X]=(X+2n)mod2n
    所 以 [ X ] 补 = ( − 5 + 16 ) m o d e 16 = 11 所以 [X]_补 = (-5+16)mode16=11 [X]=(5+16)mode16=11
    我 们 观 察 一 下 11 − 1 = 10 = ( 1010 ) 2 这 正 好 是 1101 的 反 码 , 然 后 将 ( 1010 ) 2 的 末 位 + 1 就 变 成 − 5 的 补 码 1011 我们观察一下11-1=10=(1010)_2这正好是1101的反码,然后将(1010)_2的末位+1就变成-5的补码1011 111=10=(1010)21101(1010)2+151011

    变补 已 知 [ x ] 补 求 [ − x ] 补 已知[x]_补求[-x]_补 [x][x]):
    [ x ] 补 [x]_补 [x]连同符号位一起按位变反,返回末位+1
    例如 0101 0110变补为10101010

    注意-128和-0是比较特殊的存在,-128没有补码和反码,-0也没有补码

    2.3 无符号数的表示

    无符号数相对于有符号数就简单许多,因为没有符号,如果一个编码为无符号数,则这个编码对应的数值就是这个无符号数的真值。
    例如 11001代表的无符号数就是25
    简单的C语言测试:
    无符号数没有负数,那么如果定义一个无符号数为负数,会发生什么?

    int main()
    {
    	unsigned short f = -1;
    	printf("%d",f);
    }
    

    结果为65535,因为-1的补码为1111 1111 1111 1111为无符号数的65535

    2.4 IEEE-754 float(浮点数)

    为了让数表示更大的范围和精度,引入了浮点数,计算机中一般使用的是float单精度浮点数32位double双精度浮点数64位,符合IEEE-754标准,以32位为例,以下是100的单精度浮点数表示

    signexponentmantissa
    01000 01011001 0000 0000 0000 0000 000
    1. sign 表示这个浮点数的正负,0为正,1为负。
    2. exponent表示阶码,也就是基的指数,我们应该都知道科学记数法,例如 502 502 502可以写成 5.02 ∗ 1 0 2 5.02*10^2 5.02102,其中10就代表基,浮点数的基是2。现在阶码可以表示 0 − 255 0-255 0255的数值,我们为了想让基的指数可以为负,所以做了一个映射,将阶码减去-127,这样 ( 阶 码 − 127 ) (阶码-127) (127)的范围就变成了 [ − 127 , 128 ] [-127,128] [127,128],所以真正的基的指数是 ( 阶 码 − 127 ) (阶码-127) (127)
    3. mantissa表示尾数,相当于 5.02 ∗ 1 0 2 5.02*10^2 5.02102中的 5.02 5.02 5.02,而尾数的规格化表示,整数部分一定是1,所以就隐去了这个1。
    4. 规格化, ( 二 进 制 ) 0.0110 ∗ 2 3 (二进制)0.0110*2^3 ()0.011023不是规格化,将其转为规格化为 1.1 ∗ 2 1 1.1*2^1 1.121,相当于将前部分左移,直到整数部分为1,相应的基的指数应该减少,因为不能无缘无故增加嘛。
    signexponentmantissa表示数
    s1<=E<=254M ( − 1 ) s ∗ ( 1 + M ) ∗ 2 E − 127 (-1)^s*(1+M)*2^{E-127} (1)s(1+M)2E127
    s全0非全0 ( − 1 ) s ∗ M ∗ 2 E − 126 非 规 范 浮 点 数 (-1)^s*M*2^{E-126}非规范浮点数 (1)sM2E126
    s全0全0 0 0 0
    s全1全0 ± ∞ 根 据 s 判 断 正 负 \pm\infty根据s判断正负 ±s
    s全1非全0 N a N NaN NaN
    展开全文
  • 数值数据的编码表示

    2020-09-24 20:34:34
    机器数并不能算作真正的数值。 真值 带符号位的机器数对应的真正数值(十进制的数)称为真值; 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其他位表示值. 比如如果是8位二进制,如下: 1、[1]的原码...
  • 标称型:标称型目标变量的结果只在有限目标集中取值,如真与假(标称型目标变量主要用于分类) ...数值型数值型目标变量则可以从无限的数值集合中取值,如0.100,42.001等 (数值型目标变量主要用于回归分析)
  • 华中科技大学计算机组成原理慕课答案

    万次阅读 多人点赞 2020-01-26 00:09:18
    寄存器的数据位对微程序级用户透明 C.软件与硬件具有逻辑功能的等效性 D.计算机系统层次结构中,微程序属于硬件级 2、完整的计算机系统通常包括( A ) A.硬件系统与软件系统 B.运算器、控制器、存储器 C.主机...
  • 数据结构(C++)有关练习题

    热门讨论 2008-01-02 11:27:18
    9、 已知f为单链表的表头指针,链表中存储的都是整型数据,试写出实现下列运算的递归算法: a. 求链表中的最大整数; b. 求链表的结点个数; c. 求所有整数的平均数; 告要求: 写出能运行的完整...
  • 在做数据可视化作业的时候,导入数据发现有一列数据被当成了因子型导入,需要将其转化为数值型: 直接用as.numeric()转换,不是我要的结果: 按照网上的方法,先转化为字符型再转化为数值型,所有的四位数都...
  • MySQL 面试题

    万次阅读 多人点赞 2019-09-02 16:03:33
    MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。具体可以看看 《MySQL 数据类型》 文档。 正确的使用数据类型,对数据库的优化是非常重要的。 ? MySQL 中 varchar 与 char ...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    因为Linux与Windows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失,使系统处于不稳定的状态,甚至在有的系统中会损坏硬件设备(硬盘)。在系统关机前使用 shutdown命令,系统管理员会通知所有...
  • 计算机组成原理

    万次阅读 多人点赞 2019-06-02 14:13:55
    知识改变命运,储备成就未来。 计算机组成原理 1.第一台电子计算机何时何地诞生?英文全称?...2.冯·诺依曼计算机组成、思想? 计算机组成: 运算器、控制器、存储器、输入设备、输出设备。 思想...
  • 数值型 删除一个数值类型对象 布尔型 Bool 标准整型 Int 长整型 双精度浮点型 Float 复数 数值类型对象的内建功能函数 absNumber 求Number的绝对值 coercex y 将x y转换为同一种数值类型 divmodx y 除法-取余运算的...
  • 标称型、数值型

    千次阅读 2017-05-19 22:34:17
    标称型:标称型目标变量的结果只在有限目标集中取值,如真与假(标称型目标变量主要用于分类)标称型:标称...数值型数值型目标变量则可以从无限的数值集合中取值,如0.100,42.001等 (数值型目标变量主要用于回归分析)
  • 【MATLAB】MATLAB的基础知识

    千次阅读 多人点赞 2017-04-12 11:52:00
    在MATLAB中,数组也是一个非常重要的概念,矩阵在某些情况下可视为二阶的数值型数组。但是在MATLAB中,数组和矩阵运算规则却有着较大的区别。例如,两矩阵相乘和两数组相乘所遵循的运算规则就是完全不相同的。具体...
  • vb编程遇到数值型数据超过15位但需要精确计算的一种方法,欢迎探讨交流。 提供全部源代码及工程文件。
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    OnePerson虽然存储的是Person类对象地址,但不是C中的指针,不能象指针那样可以进行加减运算,也不能转换为其它类型地址,它是引用变量,只能引用(代表)Person对象,具体意义参见以后章节。和C、C++不同,C#只能用...
  • 很明显,%#x和%d都是整型数据的输出格式控制符,整型输出4个字节,所以我看似输出了两次,实际情况却是:我只是把一个占8个字节的浮点型数据分两次输出了,而第二个浮点型数据就这样被遗忘了(我觉得是被遗忘了。...
  • 函数型数据主成分分析

    千次阅读 多人点赞 2019-04-15 08:59:29
    函数型数据主成分分析 基本思想 函数型主成分分析(FPCA,Functional Principal Components Analysis)是传统的PCA的一种推广。 考虑我们已经从数据中得到拟合曲线xi(s),s∈T,i=1,⋯&ThinSpace;,nx_{i}(s), s \...
  • 下列程序演示了如何使用itoa()函数和gcvt()函数: 1       # include 2       # include 3      4       int main () 5       { 6              int num...
  •  把数值的符号位、阶码和尾数合在一起就得到了该数的浮点存储形式。 例1 把十进制数100.25转换成协处理器中的浮点数 解: (1)进制转换: (100.25) 10 =(1100100.01) 2   (2)规格化: ...
  • 基于MATLAB的水果分级设计

    万次阅读 多人点赞 2018-06-14 14:19:35
    它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。根据它提供的 500 多个数学和工程函数,工程技术人员和科学工作者可以在它的集成环境中交互或编程以完成各自的计算。 1.2 国内外...
  • 以下哪个选项不是Python...A:错B:对从生产力发展水平看,三代是以青铜器为主要生产工具,被称为()A:艺术起源B:原始艺术时代C:青铜时代D:艺术萌芽期下列符号表示两拍的是A:B:C:D:5G全网建设与优化仿真系统中,NSA组...
  • R语言基础 期中考试

    万次阅读 多人点赞 2020-04-22 11:10:55
    1下列用来转换数据框的函数是()(2.0分)2.0 分 A、 as.list B、 as.matrix C、 as.data.frame D、 as.vector 我的答案:C 2以下函数不能直接查看plot函数的帮助文档的是:(2.0分)2.0 分 A、 ?plot B、 ??plot C、 ...
  • 【JAVA面试】java面试题整理(3)

    千次阅读 2018-10-28 12:50:13
    局部变量表存放了编译期可知的基本数据类型,对象引用,和returnAddress类型(指向一条字节码指令地址),局部变量表的内存空间在编译器确定,在运行期不变 可导致两种异常:线程请求的栈深度大于虚拟机允许的...
  • numpy的数据类型

    千次阅读 2018-05-22 22:30:31
    numpy的数据类型主要包括整数、浮点数、复数、布尔值、字符串、python对象类型,如下图所示1、使用dtype指定创建数组的数据类型 #默认是浮点数是float64 arr9 = np.array([1.,2.,3.],dtype=np.float32) print(arr9...
  • 1.下列属于合法的Java标识符是?(多选) A.$valueB.VoldC.classD.1abcE.myvalueF.void_class ...3.下列可以表示数值型数据的数据类型是?(多选) A.byteB.floatC.booleanD.long AD 4.关于数据类型的说法错...
  • 数据分析的4种典型工具简介

    千次阅读 2019-03-04 20:31:54
    Apache Drill 在基于 SQL 的数据分析和商业智能(BI)上引入了 JSON 文件模型,这使得用户能查询固定架构,演化架构,以及各种格式和数据存储中的模式无关(schema-free)数据。该体系架构中关系查询引擎和数据库的...
  • Linux实用教程(第三版)

    万次阅读 多人点赞 2019-08-27 22:55:59
    越来越多的大中企业的服务器选择了Linux作为其操作系统。近几年来,Linux系统又以其友好的图形界面、丰富的应用程序及低廉的价格,在桌面领域得到了较好的发展,受到了普通用户的欢迎。 1.1.2 Linux系统的产生 ...
  • 基本数据类型和引用数据类型的区别

    千次阅读 多人点赞 2018-03-18 21:35:18
    javascript中基本数据类型和引用数据类型的区别1、基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型。 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,315
精华内容 16,926
关键字:

下列属于数值型数据的是