定点数的表示方法


计算机中数值的表示有两种形式,一是定点数(Fixed-point Number),二是浮点数(Floating-point Number)。

1.定点数的表示形式

定点数指小数点在数中位置固定不变的数。

定点数分为定点整数和定点小数,由于小数点位置固定不变,所以存储时小数点不进行存储,按照约定的位置计算数值。原理上讲,小数点的位置可以位于任何位置,但通常将定点数表示成纯小数或纯整数。

假设以机器字长 n 位表示定点数,从右至左,从低位到高位分别为 x1,x2,x3…xn-1,xn,其中 xn 取值 0 和 1 分别表示正号和负号。如此,对于任意一个定点数 x = x n x n − 1 . . . x 2 x 1 x = x_nx_{n-1}...x_2x_1 x=xnxn1...x2x1,在定点机器中可表示为:
这里写图片描述
如果 x 表示的是纯小数,那么小数点位于 x n x_n xn x n − 1 x_{n-1} xn1 之间,如果 x 表示的是纯整数,那么小数点位于 x1 的右边。

2.定点数的原码、反码与补码

定点数是我们日常生活中使用的数,比如十进制定点正整数 5 3 10 53_{10} 5310,二进制表示为 11010 1 2 110101_2 1101012,我们看不到小数点,但可以认为小数点在数值最后一位的后面,省略不写。二进制 11010 1 2 110101_2 1101012 即为 5 3 10 53_{10} 5310 原码。对于负整数的表示,由最高位符号位为 1 表示负数,假如使用 8 位来表示 − 5 3 10 -53_{10} 5310,那么 -53 的原码为 1011010 1 2 10110101_2 101101012。实际上,计算机对定点数的存储采用补码的形式,原码到补码的转换规则如下:

正数:原码=反码=补码
负数:
反码=原码符号位为1不变,其它位取反
补码=反码+1 

需要注意的是,定点小数的补码由反码加 1,这个“1”是加在小数部分的最后一位。

以 8 位为例,53 与 -53 的原码、反码与补码具体表示如下:

[53]原=[53]反=[53]补=00110101
[-53]原=10110101
[-53]反=11001010
[-53]补=11001011

负整数的补码与原码不同,为何计算机中负整数的补码计算规则采用上述方式呢?因为计算机为了便于运算,将减法变为加法,才将整数以补码的形式存储。以时钟为例,假设现在1点,时钟为4点,将时钟矫正有两种方式,一是将时针后退4-1=3格;二是将时针向前拨 12-3=9 格。由此可见,减3和加9是等价的,因为9是(-3)对12的补码,数学公式为:

-3=+9 (mod 12)

上式在数学上为同余式,mod 12 表示 12 是模数。以计算机中 32 bits 有符号整型数值为例,除去一个符号位,数值位共 31 位,那么模是2^31。

对于定点数,由补码转换为十进制数值的规则如下:

十进制数值=(-1)*符号位*位权+其它位*位权

根据上面的转换规则,正整数补码 0011010 1 2 00110101_2 001101012,转换为十进制数值过程如下:

=(-1)*0*27 + 1*2^5 + 1*2^4 + 0*2^3 + 1*2^2 + 0*2^1 + 1*2^0
= 32 + 16 + 4 + 1
= 53

对于负整数 − 5 3 10 -53_{10} 5310 的补码 1100101 1 2 11001011_2 110010112 转为 − 5 3 10 -53_{10} 5310 的过程如下:

(-1)*1*2^7+1*2^6+0*2^5+0*2^4+1*2^3+0*2^2+1*2^1+1*2^0
=-128+64+8+2+1
=-53

当 53 除以 2 得到的结果是26.5,此时 26.5 为十进制定点小数,转换为二进制为 11010. 1 2 11010.1_2 11010.12。类似于定点二进制整数转换为十进制整数,根据每个比特位的位权,同样可以将定点二进制小数转换为十进制小数,转换过程如下:

= 1*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 + 1*2^-1
= 16 + 8 + 2 + 0.5
= 26.5

3.定点小数注意事项

对于定点小数的存储,实际上,计算机不存储小数点,但小数点的位置必须知道,不然计算机无法知道真实数值。

计算机作何知道小数点的位置呢?那么就需要有一个定点小数的规范。假设机器字长 8 bits,我们规定从左至右,第一位为符号位,接着后 5 位表示定点小数的整数部分,后两位表示定点小数的小数部分。那么 26. 5 10 26.5_{10} 26.510 的实际存储形式为 01101010。由于对定点小数并无统一的规范,且数值表示的范围和精度有限,所以普通计算机对于小数的表示采用浮点数形式,C/C++ 中也没有定点小数类型,一般使用单精度浮点数 float 和双精度浮点数 double 来表示小数。


参考文献

Introduction to Fixed Point Number Representation
计算机组成原理第四版.白中英

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值