前言
最近在备战软考,温习到数据表示方面相干的常识,所以在这里做一下记录,也不便大家参考。
什么是 R 进制
对于 R
机制,如果要实现与十进制的转换,则应用 按权开展法,其具体操作为:
将
R
进制数的每一位数值用 $R^k$ 的模式示意,即幂底数为R
,指数为k
,k
与该位和小数点间的间距无关。当该位位于小数点右边时,k
则是该位和小数点之间数码的个数;而当该位维语小数点左边时,则k
是负值,其绝对值为该位和小数点之间数码的个数加1
。
比方二进制和十进制之间的转换:$10111.01 = 1* 2^4+1*2^2+1*2^1+1*2^0+1*2^{-2}$。
再比方七进制和十进制之间的转换:$403.02 =4*7^2+3*7^0+2*7^{-2}$。
进制之间的转换
- 十进制转
R
进制
应用 短除法,比方咱们要将 $100$ 转换为二进制数,则有如下过程,最终的后果为 $1100100B$。
- 二进制转八 / 十六进制
假如咱们有一个二进制数 $100010010011$,如果咱们要将其转换为八进制数,一个八进制数须要 8 个基数来示意,所以须要 3 位二进制来示意。那么转换过程如下,即对应的八进制数为 $4223O$。
而如果咱们将要将其转换为十六进制数,一个十六进制数须要 16 个基数来示意,所以须要 4 位二进制来示意。则对应的转换过程如下,即对应的十六进制数为 $893H$。
码制
计算机中,无论咱们要存储任何数据,它都会转换为二进制码进行存储。当初的计算机中,如果咱们要进行加法运算操作,那么咱们很容易实现,因为当初的计算机体系大多采纳冯诺依曼所提出的经典计算机体系结构,其中就蕴含了加法运算器。但如果咱们要进行减法运算,那么此时就犯难了。没有减法运算器,咱们要如何实现减法运算呢?而针对这一问题,原码、反码、补码就产生了。咱们罕用这三种码来示意一个机器数,从而解决计算机做减法的问题。上面是几个数的实例,上面就别离来看看几种不同表示法的具体常识。
1 | -1 | +0 | -0 | |
---|---|---|---|---|
原码 | $0000 0001$ | $10000001$ | $00000000$ | $10000000$ |
反码 | $00000001$ | $11111110$ | $00000000$ | $11111111$ |
补码 | $00000001$ | $11111111$ | $00000000$ | $00000000$ |
- 符号位
正式理解不同码制之前,咱们先来看看符号位的定义。所谓符号位,是在内存中寄存的最右边的一位,如果该位为 $0$,那么阐明这个数示意的是负数;而如果该位为 $1$,那么就阐明这个数示意的是正数。
- 原码
是一种最简略的机器数表示法,咱们常 用最高位来示意符号位,而用余下的其余位来寄存该数二进制的绝对值。也即除开符号位之外,原码的数据位就是一个数的二进制绝对值示意。
在下面的示例中,咱们发现,尽管 $0$ 和 $-0$ 的原码不统一,然而次要还是符号位的不同,咱们再用下面的示例来进行运算:
$$0001 + 0010=0011,1 + 2 = 3$$
$$0000 + 1000= 1000,0 + (-0)=-0$$
$$0001+1001=1010,1+(-1)=-2$$
能够发现,如果咱们只是进行负数之间的加法运算,是不会呈现问题的。但一旦呈现正负数相加的状况,就会导致谬误后果,而这次要是因为符号位所引起。那有没有相应的解决办法呢?别着急,咱们接下来去看看反码。
- 反码
尽管原码很简略,然而存在的最大问题在于如果一个数加上其相反数后果不为 $0$,即 $1 + (-1)$ 的后果不为 $0$,为了解决这个问题,才有了反码的呈现。而针对反码,这里也分为两种状况:
- 如果一个数是负数,那么其反码和原码一样,如 $1$ 的原码和反码均为 $0001$。
- 如果一个数是正数,那么其反码就是其原码除符号位之外,按位取反。如 $-1$ 的原码为 $1001$,其反码为 $1110$。
这个时候咱们再来看看原码中存在的问题:
$$0001+1001=1111,1+(-1)=-0$$
能够看到通过应用反码,咱们解决了源码中两个相反数之和不为 $0$ 的状况,然而不是就代表咱们能够用反码来进行通用减法运算呢?咱们来试试两个不同的正数相加:
$$1110+1100=1010,(-1)+(-3)=-5$$
就离谱,这后果显著谬误!所以反码还是不能彻底解决减法运算的问题。而相应的,科学家们又提出了补码这一概念。
- 补码
同样的,补码也很非凡,针对正负数也分为了两种状况:
- 如果一个数是负数,那么该数的补码等于其原码,如 $1$ 的原码和补码均为 $0001$。
- 如果一个数是正数,那么该数的补码等于反码 $+1$,如 $-1$ 的反码为
1110
,那么其补码即为1111
。
同样,咱们来试试看反码中进行减法运算所呈现谬误的状况:
$$1111+1111=1110,(-1)+(-1)=-2$$
诶,完满解决了反码中两个正数相加时所呈现的后果谬误的状况。因而在计算机中,为了防止运算谬误,都是采纳的补码进行加减法运算。
- 不同码制之间的转换总结
通过下面的各种码制介绍之后,咱们将一个数的不同码制之间的转换法则总结如下图:
- 移码
除开罕用的原码、反码、补码之外,还有一种码制叫做移码。所谓移码,又叫做增码或者偏置码,它是在数 $X$ 上减少一个偏移量来定义的,通常用来示意浮点数的阶码,其示意模式相似于补码,只是其符号位用 $1$ 来示意负数,$0$ 来示意正数,则数值示意局部则是与补码雷同。
1 | -1 | +0 | -0 | |
---|---|---|---|---|
原码 | $0000 0001$ | $10000001$ | $00000000$ | $10000000$ |
反码 | $00000001$ | $11111110$ | $00000000$ | $11111111$ |
补码 | $00000001$ | $11111111$ | $00000000$ | $00000000$ |
移码 | $10000001$ | $01111111$ | $10000000$ | $00000000$ |
总结
好了,以上就是明天的所有内容了。
次要讲了对于 R
进制的示意,以及如何与十进制进行转换。而后对常见的进制之间的转换做了介绍,最初则是对原码、反码、补码、移码等不同码制之间的转换。
创作不易,如果你感觉我的文章内容对你有所帮忙,那就点个赞再走吧!