定点数的表示方法

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

1.定点数的表示形式

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

假设以机器字长n位表示定点数,从右至左,从低位到高位分别为x1,x2,x3…xn-1,xn,其中xn取值0和1分别表示正号和负号。如此,对于任意一个定点数x=xnxn-1…x2x1,在定点机器中可表示为:

如果x表示的是纯小数,那么小数点位于xn与xn-1之间,如果x表示的是纯整数,那么小数点位于x1的右边。

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

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

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

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

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

[53]原=[53]反=[53]补=001101012
[-53]原=101101012
[-53]反=110010102
[-53]补=110010112

负整数的补码与原码不同,为何计算机中负整数的补码计算规则采用上述方式呢?因为计算机为了便于运算,将减法变为加法,才将整数以补码的形式存储。以时钟为例,假设现在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)*符号位*符号位位权+其它位*其它位权

其中,s为符号位数值。根据上面的转换规则。对于正整数补码001101012,转换为十进制数值过程如下:

=(-1)*0*27+1 * 25 + 1 * 24 + 0 * 23 + 1 * 22 + 0* 21 + 1 * 20
= 32 + 16 + 4 + 1
= 5310

对于负整数-5310的补码110010112转为-5310的过程如下:

(-1)*1*27+1*26+0*25+0*24+1*23+0*22+1*21+1*20
=-128+64+8+2+1
=-5310

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

= 1 * 24 + 1 * 23 + 0 * 22 + 1 * 21 + 0* 20 + 1 * 2-1
= 16 + 8 + 2 + 0.5
= 26.5

3.定点小数注意事项

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


参考文献

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Leetcode名企之路

【Leetcode】55. 跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个位置。 示例 1:

1493
来自专栏C/C++基础

华为2017校招C++岗笔试题

输入两个字符串M和N,从字符串M中删除字符串N中所有的字符。例如,输入”abcda”和”ac”,则删除之后的第一个字符串变成”bd”。

4981
来自专栏漫漫全栈路

计算机组成原理-运算方法之数据格式

数据格式 先说下数据格式,在选择计算机数的表示方式时,需要考虑以下几个因数: 要表达的书的类型(小数,整数,实数,复数) 可能遇到的数值范围 数值精度 数据存储...

2906
来自专栏专注研发

桶排序/基数排序(Radix Sort)

基本思想:是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要...

8752
来自专栏专注研发

poj-1131-(大数)八进制转化成十进制

Fractions in octal (base 8) notation can be expressed exactly in decimal notatio...

2421
来自专栏有趣的Python

算法与数据结构(三)高级排序算法:O(nlogn)的算法:归并排序&快速排序优化对比

O(nlogn)的算法 ? o(nlogn)比O(n^2)快多少 优化改进的算法要比笨的算法快太多。 归并排序:Merge Sort ? 把数组分成左右两半 ?...

6095
来自专栏C/C++基础

定点数的加减法

数值运算的核心是指加、减、乘、除四则算术。由于计算机中的数有定点和浮点两种表示形式,因此相应有定点数的运算和浮点数的运算。本文将介绍计算机中定点数的加减法运算过...

1864
来自专栏用户画像

7.2.3 插入排序之希尔排序

直接插入排序算法适用于基本有序的排序表和数据量不大的排序。基于这两点,1959年D.L.Shell提出了希尔排序,又称为缩小增量排序。

661
来自专栏专知

关关的刷题日记12——Leetcode 189. Rotate Array 方法1、2、3

关小刷刷题12 – Leetcode 189. Rotate Array 方法1、2、3 题目 Rotate an array of n elements to...

3698
来自专栏C/C++基础

定点数的表示方法

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

2052

扫码关注云+社区

领取腾讯云代金券