计算机中的数据表示

本文深入探讨了计算机中数据的表示方式,从二进制转化和十进制之间的转换开始,详细解释了原码、反码、补码和移码的概念。接着,介绍了浮点数的表示,包括IEEE754标准的短浮点数格式,并通过实例展示了如何将十进制数转化为浮点数。最后,讨论了校验码的作用,如奇偶校验码和海明码,以及它们如何用于检测和纠正数据传输中的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据的世界

在我们的日常生活中,我们通常使用十进制来表示数据,例如今天你在网上买了价值139元的鼠标。但在计算机中,数据以二进制形式存在,电脑本身也只能识别 0 和 1。下面我们就进入二进制的世界来一起学习。

二进制转化

1、二进制与十进制的相互转化

若需将二进制数转化为十进制数,只需按权相加

例如:

(111)2 = 22* 21* 20 = (7)10

如需将十进制数转化为二进制数,只需使用除基取余法,即对于十进制数进行除2操作,并记录余数,反复操作,直到除2为0为止,然后将所记录的所有余数逆向排列即得到二进制数

(9)10 = (1001)2

机器数

原码、反码、补码、移码

机器数由两部分组成:符号位和数值位

符号位:负数的符号位为0,正数的符号位为1

原码:负数的原码为符号位(0)+二进制数,正数的原码为符号位(1)+二进制数。

反码:负数的反码为原码按位求反,正数的反码为原码

补码:负数的补码为反码+1,正数的补码为原码(补码模的概念:符号位进位后所在的权值)

移码:数值位与补码数值位相同,符号位求反

浮点数

浮点数:一种小数点位置不固定,可随需要浮动的数

表示为:N = R^E *M (其中M是浮点阶码的底(隐含,与尾数的基数相同,通常取2),E称为阶码,M称为尾数)

浮点数代码由阶码和尾数两部分构成。阶码包括阶符和阶码数值部分,尾数包括数符和尾数数值部分。

阶码:常用补码或移码表示的定点整数。阶码的符号位为正,则表示尾数表示的定点小数的算数左移N位(小数点向右移N位);阶码的符号位为负,则表示尾数表示的定点小数的算数右移N位(小数点向左移动N位)。

尾数:常用原码或补码表示的定点小数。

阶码反映浮点数的表示范围和小数点的实际位置,尾数的位数反映浮点数的精度。

规格化

为了提高运算精度,充分利用尾数的有效位数,且确保任意一个数用浮点数形式表示时其尾数的代码具有唯一性,需要采用浮点数规格化形式。

浮点数规格化即规定尾数的最高数位必须时一个有效值。

规格化的浮点数的尾数的绝对值满足条件: 1/2 <= |M| <= 1

(1)原码规格化:

正数为:0.1……的形式,最大值表示为0.1……1,最小值表示为0.10……0

负数为:1.1……的形式,最大值表示为1.10……0,最小值表示为1.111……1

当浮点数运算结果为非规格化需进行规格化处理:将尾数算数左移一位(小数点右一位),阶码减一

当浮点数运算的结果尾数出现溢出(双符号位为01或10):将尾数算数右移一位(小数点左移一位),阶码加一

IEEE754标准

IEEF754标准规定常用的浮点数格式有:短浮点数、长浮点数、临时浮点数

IEEF754标准的浮点数(短浮点数和长浮点数)的尾数用采取隐藏位的策略的原码表示,阶码用移码表示

对于32位短浮点数,最高位是数符位,后八位为阶码,阶码用移码表示,实际偏移量为2^8-1 = 127。其余23位是原码表示的尾数数值位。其中,尾数的最高位总是‘1’,为了更高使尾数多表示一位有效值,将1隐含,所以实际上尾数有24位,隐藏的1是整数,23位尾数是纯小数。

例题:将十进制数20.59375转化成IEEE754标准的32位短浮点数

(20.59375)10 = (10100.10011)2

(10100.10011)2 = 1.010010011* 2^4

S0 = 0(正数) 阶码 = 4 + 127 - 131 = 10000011 尾数M = 01001001100……(隐含1,原码表示)

所以F = 0 10000011 01001001100……

校验码

1、奇偶校验码

奇校验码:通过在编码中增加一位校验码来使编码中1的个数为奇数

偶校验码:通过在编码中增加一位校验码来使编码中1的个数为偶数

奇偶校验码只能检测出奇数个错误(出现奇数个错误,编码中1的个数的奇偶性便会发生改变)

2、海明码

汉明码默认一串数据只错一位

海明码由校验位和数据位构成,在数据位之间的特定位置上插入k个校验位,通过扩大码距来实现检错和纠错。

设数据位为n位,校验位为k位,则n和k必须满足以下关系:2^k - 1 >= n+k。Di表示数据位数据、Pi表示校验位数据

校验位在海明码位的第2^(i-1)位置上

假设数据为:D7 D6 D5 D4 D3 D2 D1 D0 = 01101001

海明码算法:

(1)根据公式:2^k - 1 >= n+k来判断校验位的个数(例子中的数据位为8位,所以校验位的个数应该为4位)

(2)确定数据位和校验位在海明码中的位置:

H12H11H10H9H8H7H6H5H4H3H2H1
D7D6D5D4P4D3D2D1P3D0P2P1

(3)分组:将海明码位置的序列转换成二进制:如H1的序列为1,转化为二进制为0001。

​ 按照以二进制是否满足:* * * 1、 * * 1 * 、* 1 * *、 1 * * *的关系来分组。

​ 所以有{P1, D0 , D1, D3, D4, D6} {P2, D0, D2, D3, D5, D6} {P3, D1, D2, D3, D7} {P4, D4, D5, D6, D7}

校验码的值则根据1的数量的奇偶判断。当为偶校验码时,P1 = 1, P2 = 0, P3 = 1, P4 = 0.

检错:

先分组:P1、P2、P3、P4 。再分别对每个组校验,没有错的给它0,有错的给1. 按分组序号从大到小排列,若不全为0时说明发生了错误。错误的位置即为以P4P3P2P1对应的十进制数为序列的数据位位置上的数,将其取反纠错即可。如0101对应十进制数5,则D5(H10)发生了错误。


下面使用logisim模拟海明码形成与检错电路

海明码的形成
海明码检错


3、循环冗余码

CRC码是利用生成多项式为k个数据为产生r个校验位来进行编码,长度为k+r

CRC码由数据位和校验位组成,数据位占k位,校验位占n-k位,求CRC编码时采用模2运算。

例如将四位有效信息1100编成循环校验码,选择生成多项式1011

1、确定M(x) = x^3 + x^2 即1100

2、将M(x)左移r位(为了空出r位,拼接r位余数),r位表示M(x)的最高次,即r=3 M(x)*(x^r) = x^6 + x^5 = 1100000

3、多项式G(x) = x^3 + x^1 + 1 即1011

4、求余数:M(x)*x^r/G(x) = 1100000/1011 = 1110 + 010/1011(其中,010是余数)

5、循环冗余码:110000010

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值