WaterNorth's Blog

计算机中数据信息的表示

19 分钟WaterNorth

重点 #

  • 十进制、二进制、十六进制数及其相互转换(整数除基取余法、小数乘基取整法);
  • 机器数的原码、补码、反码、移码的转换方法;
  • 定点数、浮点数的表示方法及其及数据的范围;
  • 规格化浮点数的概念及计算;
  • IEEE 754浮点数的表示,怎么将一个实数转换为IEEE 754单精度格式浮点数。

一、进位计数制 #

基数:每个数位所用到的不同数码的个数。

:不同数位的固定常数。

计算机中使用二进制数的原因:

  • 便于物理器件实现:信号的有无,电平的高低;
  • 运算规则简单:r 进制数,其求和、求积的公式各有 r×(r+1)/2 种。十进制有55种,而二进制只有3种 0+0=0、0+1=1+0=1、1+1=10;
  • 便于实现逻辑运算:设计计算机的逻辑电路。

数制间的转换

十进制(D)→二进制(B) :小数部分乘2取整,整数部分除2取余;

二进制(B)→十进制(D) :按权相加法

101011.1001B=1×25+1×23+1×21+1×20+1×21×24=43.5625D101011.1001B = 1×2^5+1×2^3+1×2^1+1×2^0+1×2^{-1} ×2^{-4} = 43.5625D

二(B)、八(O)、十(D)、十六(H)进制互相转换

二、机器数的编码表示 #

机器数:计算机中的数据,以二进制编码方式存放在计算机的 存储器中,分为有符号数和无符号数两大类。

1、原码 #

原码是最直观的表示方法,它直接用二进制数表示一个数,包括正负号。在原码中,最高位(最左边的位)是符号位,0 表示正数,1 表示负数。其余位表示数值本身。仅用于理解数值的符号与绝对值关系,且零的原码表示有四种,实际运算中较少直接使用。

例如,假设机器字长5位,则下列数值及对应的原码为:

X=0.1011BX= 0.1011B[X]=0.1011[X]_原 = 0.1011

X=0.1011BX= - 0.1011B[X]=1.1011[X]_原 = 1.1011

X=+1011BX=+ 1011B[X]=0,1011[X]_原 = 0, 1011

X=1011BX= - 1011B[X]=1,1011[X]_原 = 1, 1011

结论:原码表示,符号位数值化,数值位不变。

2、反码 #

反码主要用于表示负数。对于正数,其反码与其原码相同。对于负数,其反码是将原码除符号位外的所有位取反(0 变 1,1 变 0)。解决了原码中加减法运算复杂的问题,但仍存在四种零的表示(0000000011111111)。反码在早期计算机中用于简化运算,现逐渐被补码取代。

例如,假设机器字长5位,则下列数值及对应的原码和反码为:

X=0.1011BX= 0.1011B[X]=0.1011[X]_原 = 0.1011[X]=0.1011[X]_反=0.1011

X=0.1011BX= - 0.1011B[X]=1.1011[X]_原 = 1.1011[X]=1.0100[X]_反=1.0100

X=+1011BX=+ 1011B[X]=0,1011[X]_原 = 0, 1011[X]=0,1011[X]_反=0,1011

X=1011BX= - 1011B[X]=1,1011[X]_原 = 1, 1011[X]=1,0100[X]_反=1,0100

结论:对于正数,其反码与其原码相同。对于负数,其反码是将原码除符号位外的所有位取反(0 变 1,1 变 0)。

3、补码 #

补码是计算机中最常用的表示方法,用于进行二进制加法运算。对于正数,其补码与其原码相同。对于负数,其补码是其反码加 1。补码的一个重要特性是,任何数的补码加上该数本身,结果总是 0。加法、减法可统一为补码加法(如a - b = a + (-b的补码)),简化了硬件设计,且零的补码表示唯一,现代计算机中几乎所有数值运算均采用补码表示。

例如,假设机器字长5位,则下列数值及对应的原码、反码和补码为:

X=0.1011BX= 0.1011B[X]=0.1011[X]_原 = 0.1011[X]=0.1011[X]_反=0.1011[X]=0.1011[X]_补= 0.1011

X=0.1011BX= - 0.1011B[X]=1.1011[X]_原 = 1.1011[X]=1.0100[X]_反=1.0100[X]=1.0101[X]_补= 1.0101

X=+1011BX=+ 1011B[X]=0,1011[X]_原 = 0, 1011[X]=0,1011[X]_反=0,1011[X]=0,1011[X]_补= 0,1011

X=1011BX= - 1011B[X]=1,1011[X]_原 = 1, 1011[X]=1,0100[X]_反=1,0100[X]=1,0101[X]_补= 1,0101

结论:正数的原码、反码、补码表示都相同;对于负数,符号位保持不变,其余各位变反,末位加1(反码加1)。

4、移码 #

移码主要用于浮点数的阶码部分,通过将数值加上一个固定偏移量 K 来表示。移码只用于表示浮点数的阶码,所以只用于整数。移码的数值大小关系与实际值一致(如10000001 > 10000000对应1 > 0),适合浮点数阶码的排序。移码将有符号数转换为无符号数范围,简化了硬件比较逻辑。通常用作浮点数标准(如IEEE 754)中阶码的编码方式。

例如,假设机器字长5位,则下列数值及对应的移码为:

x=0.1011x=0.1011[x]1.1011[x]_移= 1.1011

x=0.1011x= - 0.1011[x]0.0101[x]_移= 0.0101

x=+1010x=+1010[x]1,1010[x]_移= 1,1010

x=1010x= -1010[x]0,0110[x]_移= 0,0110

结论:移码可视为补码的符号位取反。

三、数的定点表示与浮点表示 #

1、定点数 #

定点数表示法约定计算机中所有数据的小数点位置固定,其中,将小数点的位置固定在数据的最高位之前(或符号位之后)的数据表示称为定点小数,而将小数点固定在最低数位之后的数据表示称为定点整数。另外,由于小数点位置固定,因此小数点不必再用符号表示,其位置也无需存储。

符号位定点n位二进制数
定点小数XSX_S..X1......XnX_1......X_n
符号位n位二进制数定点
定点整数XSX_SX1......XnX_1......X_n..

表示范围: 定点小数:2nX12n2^{-n}\le\left | X \right | \le1-2^{-n}; 定点整数:0X2n10\le\left | X \right | \le2^n-1

2、浮点数 #

浮点数中的小数点位置并不固定,也就是小数点位置可以浮动,这也是浮点数得名的原因。为了扩大浮点数的表示范围和提高其表示精度,二进制浮点数表示采用了类似十进制科学记数法的表示方法,任意一个二进制数 NN 都可以表示成如下形式:N=2EMN=2^E*M

采用这种方法,二进制浮点数可表示成阶码 EE 和尾数 MM 两部分,其中阶码 EE 是定点整数,而尾数 MM 是定点小数。阶码的位数决定数据的表示范围,阶码的位数越多,能表示的数据范围就越大,而阶码的值决定了小数点的位置;尾数的位数决定数据表示的精度。阶码长度相同时,分配给尾数的数位越多,数据表示的精度就越高。

阶符阶值尾符尾数值
ESE_SE1......EmE_1......E_mMSM_SM1......MnM_1......M_n

浮点数的规格化:若不对浮点数作约束,则同一数据的编码表示不唯一。与科学计数法类似,规定:当尾数的值不为 00 时,其绝对值应大于等于 0.50.5(十进制),即M0.5\left | M \right | \ge 0.5。而尾数又为定点小数,即M<1\left | M \right | < 1,故 0.5M<10.5 \le\left | M \right | < 1。必须通过左移尾数并同时修改阶码使其变为规格化的浮点数, 这种操作被称为浮点数的规格化处理。

尾数要满足0.5M<10.5 \le\left | M \right | < 1,则对于原码表示,尾数值最高位为 11,即 M1=1M_1 = 1 ;对于补码表示,要求符号位与最高位相异,即 Ms.M1=0.11.0M_s.M_1 = 0.1 或 1.0

浮点数的表示范围:显然当阶码为最大值,尾数为最大值时,浮点数为正数最大值;而当阶码为最小值,尾数为正数最小值时,浮点数为正数最小值,这个值也就是浮点数的最小精度。同理,当阶码为最大值,尾数为最小负数时,浮点数为负数最小值;而当阶码为最小值,尾数为负数最大值时,浮点数为负数最大值。浮点数有效扩大了数据表示范围,但受计算机字长限制,浮点数仍然存在溢出现象。

四、IEEE 754浮点数 #

1、浮点数的隐藏位技术 #

因为原码表示的规格化的浮点数中,当尾数不为0时,其最高数值位必为1,所以在将这样的浮点数写入内存或磁盘时,不必给出该位,可左移一位去掉它,这种处理技术称为隐藏位技术。这样用同样多的位能多保存一位二进制位。当然,在取回这样的浮点数到运算器执行运算时,必须先恢复该隐藏位。

2、IEEE 754浮点数格式 #

IEEE 754浮点数分为两种:单精度32位,双精度64位,对应C/C++中的float(32位) 和double(64位)类型。采用1个单独符号位 S。阶码用k位移码表示(这样就不用给阶码提供符号位了),偏移量不是通常的2k,而是2k-1,尾码用n位的小数表示,含1位隐藏位,即尾数的值大于等于1而小于2。

(1)s×(1.f)×2E127(-1)^{s} \times(1 . f) \times 2^{E-127}

单精度浮点数格式(float):

  • S为浮点数的符号位,0表示正数,1表示负数;
  • E为阶码,8位,采用移码表示;
  • M为尾码,23位,纯小数表示,隐藏位技术(真值=1+M);
  • 阶码E采用移码表示,但只偏移 271=1272^7 –1=127
  • 编码值=实际值+偏移值(127)。

双精度浮点数格式(double):

  • S=浮点数的符号位,0表示正数,1表示负数;
  • E=阶码,11位,采用移码表示;
  • M=尾码,52位,纯小数表示,隐藏位技术(真值=1+M);
  • 阶码E采用移码表示,但只偏移 2101=10232^{10} -1=1023

几种特殊数据的存储规则

  • 正0:所有的数据位都是0;
  • 负0:最高位为1,其它的数据位是0;
  • 正/负无穷:符号位为0/1,阶码位全为1,有效数字全为0;
  • NAN:非法的浮点数,阶码位全为1,有效数字不全为0;

五、数字编码 #

1、二-十进制编码(BCD码,Binary-Decimal Code) #

8421码(有权码)

0123456789
0000000100100011010001010110011110001001

2421码(有权码)

0123456789
0000000100100011010010111100110111101111
2421码的一个重要特性是互补于9:对于十进制数D,其对应的2421码与数字9-D的2421码逐位相反。

余3码(无权码)

0123456789
0011010001010110011110001001101010111100
每个编码代表的值比其对应的十进制数多“3” —余3;两个余3码相加产生进位时,正好代表十进制数的进位。

Gray码(格雷码)(无权码)

0123456789
0000000100110010011011101010100011000100
任意相邻两组代码仅有一位不同。又称为循环码,编码不唯一。在时序逻辑电路中,出错少,可靠性高,转换快,延时短。

2、数据校验码 #

为了提高计算机的可靠性,除了采取选用更高可靠性的器件,更好的生产工艺等措施之外,还可以从数据编码上想一些办法,即采用冗余的线路,在原有数据位之外再增加一到几位校验位,使新得到的码字带上某种特性,之后则通过检查该码字是否仍保持有这一特性,来发现是否出现了错误,甚至定位错误后,自动改正这一错误,这就是检错纠错编码技术。

奇偶校验码

原理:在 k 位数据码之外增加 1 位校验位,使 k+1 位码字中取值为 1 的位数总保持为偶数(偶校验)或奇数 (奇校验)

如:0110111 奇校验:01101110 偶校验:01101111

可以检测出数据中一位出错或奇数位出错,但不能检测出错位置,也不能检测出偶数位错误,用于并行数据传送。

海明校验码(Hamming)

原理:为 k 个数据位设立 r 个校验位,使 k+r 位组成的码 字同时具有这样两个特性:

  • 能发现并改正 k+r 位中任何一位出错;
  • 能发现 k+r 位中任何二位同时出错,但无法改正。

合理地用 k 位数据位形成 r 个校验位的值,即保证用 k 个数据位中不同的数据位组合来形成每个校验位的值,使任何一个数据位出错时,将影响 r 个校验位中不同的校验位组合起变化。换言之,通过检查是哪种校验位组合起了变化,就能确定是哪个数据位错,对该位求反则实现纠错。用于并行数据传送。

循环冗余校验码

在 k 位数据位串行移位输出的过程中,用带有异或门控制的移位寄存器形成 r 个校验位的值,跟随在数据位之后传送走。在接收端再对 k+r 位的码字进行合法与出错检查,若可能则自动改错。用于串行数据传输。

循环冗余码是在 k 位数据位串行移位输出过程中求出 r 个校验位的值。 其数学原理用的是模 2 除。即对由 k 个数据位后跟 r 个取值为 0 的位构成的数,除以从数学表中查来的一个生成多项式(对应一个特定的 r + 1 位的二进制数),求出的 r 位的余数就是校验位的结果。

为了描述不断移位操作过程中的数据,引进伪变量 X 和它的的不同的幂,以表示一个二进制数取值为 1 的那些位的值。此时原来说的 k 位数据,k + r 位码字,r 位的余数均可以用一元多项式表示。模 2 除时作除数用的二进制数也表现为多项式的形式,叫做生成多项式。

评论

0

评论功能待配置数据库后启用。