数据表示方法

A.数据格式

1.定点数的表示方法

定点数:小数点位置固定不变

image-20240311下午33801681

表示范围:

image-20240311下午34102978

2.浮点数的表示方法

浮点数:小数点位置随比例因子的不同而在一定范围内可以自由浮动

image-20240311下午34232725

image-20240311下午34507390

3.十进制数串的表示方法

  • 字符串形式(非压缩型BCD码): 一个字节保存一位

  • 压缩的十进制数串形式(压缩型BCD码): 一个字节保存两位

  • 符号位:用四位编码中的六种冗余状态表示, 如用12(C)表示正号,13(D)表示负号

image-20240311下午34804215

B.数的机器码表示

真值: 一般书写的数

机器数: 机器中把符号位和数值一起用编码表示的数

原码表示法

正数第一位为0,负数第一位为1。(如果是纯小数,则个位为符号位)

原码有两个0,以8位二进制数为例:

  • [+0] = 00000000

  • [-0] = 10000000

原码表示法简单明了,易于和真值转换,但是加法运算复杂(因为需要考虑第一位的正负而不能直接把8位数相加)

反码表示法

正数的反码和原码一样,负数的反码为原码二进制取反但是符号位仍然是1,也就是说取反操作不对符号位生效

0的反码:

  • [+0] = 00000000

  • [-0] = 11111111

补码表示法

正数的补码和原码一样,负数的补码相当于反码+1

补码的原理:在数的长度一定时,可以使用补码来代替负数进行加减法。即计算0111+(-0011)和计算0111+1101的结果分别为0100和10100(舍弃首位1,结果相同)

0的补码:

  • [+0] = 00000000

  • [-0] = 00000000

使用补码可以把减法运算变成加法运算

如果使用原码,一个正数加一个负数不能直接把两个数的原码相加得到结果。如果使用补码,一个正数的补码加一个负数补码可以直接带上符号相加,得到的就是结果的补码

补码的补码等于自身

移码表示法

通常用来表示浮点数的阶码

移码把真值向右移动变成了非负数,即把n-1位真值(一位符号位)加上2的n次方得到移码

以6位移码举例

  • [+10101] = 1000000 + 10101 = 1,10101

  • [-10101] = 1000000 + (-10101) = 0,10101

可以看到,移码使用了一个逗号(不是小数点)把第一位分离了出来,显然第一位为1时是非负数,为0时是负数

Quiz:

设机器字长16位,定点整数表示,尾数15位,数符1位,问原码、补码的表示范围分别是多少?

image-20240311下午40106021

C.字符与字符串的表示

按照 IEEE754 的标准,有32位浮点数和64位浮点数的标准格式

IEEE754 的标准中对32位浮点数N的定义: 若E=255且M<>0,则N=NaN(无定义数据) 若E=255且M=0,则N=(-1)S∞(正负无穷) 若E=0且M=0,则N=(-1)S0(正负零) 若0<E<255,则N=(-1)S×(1.M)×2E-127(规格化数) 若E=0且M<>0,则N=(-1)S×(0.M)×2-126(非规格化数)

在机器中从左向右分为三个部分

  • S

    • 1位

    • 浮点数的符号位,0表示正数,1表示负数

  • Exp

    • 阶码,用移码表示

    • float为8位,double为11位

    • Bias偏移量,float为127(2^7-1),double为1023(2^10-1)

  • Frac

    • 小数字段,用原码表示

    • float为23位,double为20位

    • 小数点在尾域的最前面。规格化数中尾数M=1+Frac(即隐含最高位的1,提升精度,非规格化数中没有这个规则)

关于移码表示的阶码:

  • 最小的阶为00…001

  • 最大的阶为11…110

阶码为全0与全1被用来表示其他数

基本思想:

以2.13*10^19为例,2.13为尾数,10为基数,19为阶

  • 尾数常用原码或补码表示。尾数的有效数字位数决定了浮点数的精度

  • 阶为定点整数,常用移码或补码表示。阶码决定了浮点数的表示范围

  • 规格化尾数规格化形式:尾数为纯小数且最高位必须为1(原码表示时为1,如果是补码或反码的负数则最高位为0),个位表示符号,0为正1为负 每个小数都可以转换成一个唯一的规格化数

example:

若浮点数x的754标准存储格式为(41360000)16,求其浮点数的十进制数值。

  1. 二进制表达: 0 100 0001 0 011 0110 0000 0000 0000 0000

  2. 求E: e=E-127=10000010-01111111=00000011=3(10)

  3. 1.M=1.011 0110 0000 0000 0000 0000 =1.011011

  4. X=(-1)^S× (1.M)× 2^e = = +(1.011011)×2^3 = 11.375(10) 👏

特例:

  • x=-1/2=-0.100...0的补码1.100...0在补码中不是规格化数

  • x=-1的补码1.00...00是规格化数

D.校验码

奇偶校验码:加一个校验位,使整个数据中1的个数保证为奇(偶)数个。

0110110 奇校验位为1,偶校验位为0 设X=X0X1X2……Xn-1,则 偶校验位C=X0⊕X1⊕X2⊕ ……⊕Xn-1 发送时,数据为X0X1X2……Xn-1C 接收时,数据为X0′X1′X2′……Xn-1′C′ 接收校验F= X0′⊕X1′⊕X2′⊕……⊕Xn-1′⊕C ′ 若F=1,则接收信息有错 优点:实现简单 缺点:只能检测奇数个错误

Last updated