计算机组成原理——数据的表示

本文若无特别说明,所有数据均为有符号数
在计算机中,所有的数都是二进制存储的,但是在表示的时候还常常用到八进制、十进制、十六进制的数,这之间的转化就尤为关键,而数据还有整数和实数之分,那么计算机是如何表示他们的呢?

进制的转换

在谈论进制的转换之前,要先介绍一个概念:位权
比如说一个十进制数345可以表示成3×102+4×101+5×100,也就是说,百位上的3有一个隐含的100与其相乘,十位上的4有一个隐含的10与其相乘,个位上的5有个隐含的1与其相乘,它们的结果再相加就是我们想要的数。而这个隐含的数,就叫位权。(袁春风的书将其称为进位计数制)

了解了这个概念之后,n进制向十进制的转换便迎刃而解了,无论是几进制,只要算出各个位置上的数和该位的位权之后再相加就可以了,比如八进制的345就是3×82+4×81+5×80=22910(下标表示进制),其他的以此类推。
那么十进制又是如何转化成其他进制的呢?读者可能在其他文章中看到这样的进制转化算法进制转换的一般方法
那么为什么要这么算呢?我以我上面的3×82+4×81+5×80=229为例,我们左右两边同时除以一个8,这个式子就变成了3×81+4×80+5×8-1=(229/8),我们可以看到5所在的位置已经变成了一个小数,也就是说,在除以8的过程中左边的式子变成了两部分,整数部分3×81+4×80和小数部分5×8-1,我们回想一下除法公式,如果说一个数除不尽的话,要么在结果上添小数位继续除,要么作为余数保留下来,也就是说,在上述过程中,5作为余数保留了下来,继续除以8,4又作为余数保留了下来,直到结果为0,最后一个余数就是最高位,符合上图中的算法。
N进制转M进制可以以10进制为跳板,N先转换成10进制,10进制再转换成M进制。
下面讲一个二进制、八进制、十六进制转换的技巧,我们先观察一组数

二进制八进制十六进制
11177
1000108
101012515
11010321a
1101001101011016465569ad

我们可以看到,三位二进制数对应一位八进制数,四位二进制数对应一位十六进制数,比如112=38,0102=28,合在一起就是328,十六进制同理。
而任意进制之间的直接转换(M进制转N进制),我认为比较复杂,难以实现,如果读者有好方法,请在评论区告诉我。

而十进制小数的转换方法如下:
例子来自百度百科
十进制小数转二进制
如:0.625=0.1012
0.625×2=1.25————取出整数部分1
0.25×2=0.5—————取出整数部分0
0.5×2=1——————取出整数部分1
再如:0.7=0.1 0110 0110…2
0.7×2=1.4——————取出整数部分1
0.4×2=0.8——————取出整数部分0
0.8×2=1.6——————取出整数部分1
0.6×2=1.2——————取出整数部分1
0.2×2=0.4——————取出整数部分0
0.4×2=0.8——————取出整数部分0
0.8×2=1.6——————取出整数部分1
0.6×2=1.2——————取出整数部分1
0.2×2=0.4——————取出整数部分0

我们可以看到第二个例子可以无限的乘下去,所以说计算机在保存一些小数的时候是不精确的,这也就造成了一些关于浮点数的计算得不到我们想要的结果的问题。
至于如何解决这个问题不在本文的范畴中,大家可以看其他文章学习

机械数的表示

计算机的所有数据均为二进制存储,研究二进制数的表示方法就尤为重要,在计算机中二进制数的表示方法一般有原码反码补码三种。

二进制整数的表示

  • 原码

原码是最简单,最基础的一种保存方式,无符号整数的原码表示法就是简单地将一个数转换为二进制,然后保存在内存中;整数的数值部分的转换与无符号整数的转换方法一样,但整数的最高位表示的是该数的符号,一般0表示正,1表示负。

11010
无符号整数26
整数-10

由上述规则就可以推测出无符号整数和整数的原码表示范围。

假设一个数据由一个字节(8位)来保存

可表示的范围
无符号整数0~255
整数-127~127
  • 反码
    反码就是原码除符号位之外的数按位取反,若是无符号数就全部位取反。反码常常作为数据运算的中间码,计算机一般不会直接储存反码。
    比如:无符号整数11010的反码为00101
    整数11010的反码为10101

  • 补码
    补码是计算机中最广泛的保存方式,在介绍补码之前先介绍“”,“模”表示一个计量系统的计量范围,比如一个十进制数可表示0~ 9这十个数,那么十进制数的模就是10,计算机也是一个计量系统,假设计算机用一个字节来表示一个无符号整数,那么可表示的范围就是00000000~ 11111111,模就是256。我们想象一个十进制的钟表,现在指针指向6,我想把指针指向2有两种方法,一种是往回拨4,即6-4=2,一种是往后拨6,即(6+6)%10=2,在这个钟表系统中,6-4=6+6,我们就说-4的补码为6,从这个例子中可以看出,补码使一个减法运算变成了加法运算,事实上,补码就是专门为减法运算而产生的。
    十进制的钟
    在二进制中补码有更简单的转换方法,表示如下

补码
正数与原码相同
负数除符号位外按位取反后加一

比如11010的补码就是10110
01010的补码就是01010

而补码的好处不仅只是把减法变成了加法,在使用原码的时候有一个棘手的问题,0该如何表示?事实上,在原码中存在两个0,+0:00000000和-0:10000000,而在补码中就没有这种困扰,按照补码的规则10000000的补码表示就是00000000,与+0一样,所以在补码中只有一个0,但是补码中确实有10000000这个数,在上面原码的介绍中我们知道8位可表示的范围是-127~127,而由于补码中多了一个10000000,人们规定就用它来表示-128,所以假如计算机用一个字节来表示数据,那么

补码的表示范围-128~127

二进制实数的表示

定点数

当数据有小数位时,计算机会约定前几位为整数部分,后几位为小数部分,也就是说小数点不移动,这就是定点数(整数也是定点数),定点数的原码,反码和补码的转换规则和整数类似。
定点数的表示

浮点数

通过学习定点数,我们很容易就发现,由于小数点固定,数据的表示就给计算机带来很大的限制,由此,浮点数成为计算机通常保存实数的方式。
我们先来回忆一下小学时学过的科学计数法,比如说450000就可以表示成4.5×105的形式,浮点数的表示原理与此是一样的,比如1010010.1100就可以表示成0.10100101100×27(注意小数点所在的位置),而其中的“7”我们就称之为阶码,浮点数表示方法如下:
浮点数的表示
假设符号占1位,阶码符号占1位,阶码占4位,尾数占11位,于是,1010010.1100就可以表示成00|0111|10100101100
浮点数的原码,反码和补码的转换规则和整数类似。

规格化

我们再看一个例子,将1010010.1100表示成浮点数,有两种结果,00|0111|10100101100和00|1001|00101001011,很容易察觉出来第一种方式更好,因为它保留了更多的有效位,更加节约内存,我们把这种将有效数字尽量占满尾数数位的方式称为规格化,即真值的尾数部分的最高位为非0数。当有效位在小数点前面时(计算时常有这种结果),就进行“右规”,尾数每右移一位,阶码就加以,“左规”则与之相反。
规格化还使浮点数只有一种表示方式,让浮点数更加规范。
注意:若浮点数是以补码表示,则规格化的标志是尾数最高位和符号位不同。其中的证明可由读者自行思考

移码

移码的定义是:在真值上加上一个常数,这个常数叫偏置值。通常取2n,这个n是数据位,即机器字长去掉一个符号位。我们注意到,2n就是计算机这个计量系统的“”,事实上,在二进制的转换上,移码就是补码的符号位取反
还记得上面的十进制钟表吗?-4的补码是6,而-4+10=6,而由于移码中最高位不再表示符号,所以可表示的整数将会更大,16=6+10,可知16就是6的移码。在二进制上也是这个道理。
由此可以感觉到,移码应该是和补码有着相似的性质。
由移码的转换规则可知,移码和补码一样,只有一个0,即10000000,而移码全0时,对应的真值最小值−2n。移码全1时,对应真值的最大值2n−1。
移码也有补码不可比拟的优点,它可以更直观的显示出数的大小,而不必再去纠结符号,对于计算机的运算更加方便。

IEEE754标准

IEEE754的是电气和电子工程师协会(IEEE)所指定的二进制浮点数算术标准,是目前使用最广泛的二进制浮点数标准,由于本文是为机械数加减法做准备,故不再详细介绍此标准。关于此标准请参考IEEE754标准——百度百科
注意:IEEE754中尾数前默认省略最高位1。IEEE的那些工程师们真是为了省点内存而想尽办法=-=

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值