进制数转换与原反补码

1、R进制数的表示

对于任意一个R进制数 ( N ) R (N)_R (N)R,若 ( N ) R (N)_R (N)R中有m位小数和n位整数,每位数值 D i D_i Di,i∈(-m,n-1),是0~R-1中任一数值,即 ( N ) R = ( D n − 1 D n − 2 ⋅ ⋅ ⋅ D 0 D − 1 ⋅ ⋅ ⋅ D − m ) R (N)_R=(D_{n-1}D_{n-2}···D_0D_{-1}···D_{-m})_R (N)R=(Dn1Dn2D0D1Dm)R,则它可以展开成 ( N ) R = ∑ i − m n − 1 D i R i (N)_R=\sum_{i-m}^{n-1}{D_iR^i} (N)R=imn1DiRi

例如:
( 85 ) 10 = 8 ∗ 1 0 1 + 5 ∗ 1 0 0 (85)_{10}=8*10^1+5*10^0 (85)10=8101+5100,
( 1101.01 ) 2 = 1 ∗ 2 3 + 1 ∗ 2 2 + 0 ∗ 2 1 + 1 ∗ 2 0 + 0 ∗ 2 − 1 + 1 ∗ 2 − 2 (1101.01)_2=1*2^3+1*2^2+0*2^1+1*2^0+0*2^{-1}+1*2^{-2} (1101.01)2=123+122+021+120+021+122

一个R进制数的展开式可以看作由数码、基数、位权组成。
数码是指各个数位中允许选用的数字符号;
基数是指某进位计数制中所允许选用的数码个数;
位权反映了同一个数码在不同数位上表示不同数值。

例如:
8 5 10 85_{10} 8510为十进制数,数码有0到9共10个数字符号,基数为10,位权是以10为底的指数幂。

( 1101.01 ) 2 (1101.01)_2 (1101.01)2为二进制数,数码有0和1两个,基数为2,位权是以2为底的指数幂。

2、进制数之间的转换

进制数之间的转换可以分为三类,第一类是R进制数转换为十进制数,第二类为将十进制数转换为R进制数,第三类为R进制数之间的转换。

1、R进制数转换为十进制数
这一类问题稍微简单,只要将R进制数按照如上展开式展开,计算即可获得相应的十进制数。

2、将十进制数转化为R进制数
这类问题比较繁琐,需要将十进制的整数部分和小数部分分别转换,然后用小数点合并。
①整数部分:采用辗转相除法,除R逆序取余
②小数部分:采用乘基取整法,乘R顺序取整

3、R进制之间的转换
一般来说,非十进制之间的数制转换是指二、八、十六进制数之间的转换,这是由2的整数次幂决定的。当然,诸如四进制与五进制等非2的整数次幂进制数的转换,可以先转换成十进制,然后再做辗转相除处理。

二、八、十六进制之间的转换方法如下表:

行转列二进制八进制十六进制
二进制三合一四合一
八进制一变三先一变三,再四合一
十六进制一变四先一变四,再三合一

其中,“一”,“三”,“四”表示二进制数的位数。即一位八进制数可以变为三位二进制数,一位十六进制数可以变为四位二进制数。

3、有符号数的表示

先来谈谈机器数与真值。
一个数在计算机中的表现形式成为机器数。由于CPU很“蠢”,它只认识0和1,因此机器数就是由0和1组成的二进制数。一个机器数所表示的数值称为真值,真值一般用十进制数表示,如-85、50、-50、0等等。

有符号数可以采用原码、反码、补码等形式表示。将n位字长的最高位作为符号位,0表示正数符号,1表示负数符号。原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。对于一个正数来说,它的原码、反码、补码都是同一个数;对于一个负数来说,反码是在该负数原码符号位不变的情况下,其余位按位取反所得,补码则在反码的形式上再加1。

那么,为什么要用三种码表示一个数呢?
首先,人类希望能更好地与计算机数据打交道,原码是人眼最能直观看出的机器数所表示的真值,原码的出现无可非议。

对于反码的出现,需要从简化计算机硬件设计的角度理解。虽然认为规定了符号位,但计算机不管,照样将符号位当成普通的二进制位,显然,要让计算机“认识”符号位的电路设计不容易实现。于是,索性就让符号位也参与运算,根据一个数减去一个整数等于加上一个负数的规则,人类发明了反码,这不仅消除了计算机难识别符号位的困扰,并且还省去了计算机减法电路的设计(cpu硬件实现减法比加法复杂得多),从而提高了运算效率。
举个例子:

//显然,原码减法转换为加法的运算结果是不正确的
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [1000 0010]原 = -2

//而反码的出现解决了原码做减法的问题
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
//总而言之,反码的出现避开了计算机识别符号位的困难,并解决了原码做减法的问题。

至于补码,这是为了避免计算机数据表示的二义性。细心的读者会发现,上面例子中反码计算结果是-0,那+0又如何呢?
来看看8位计算机中特殊数值的原码、反码、补码:
0的原码有两种:00000000B,10000000B, 反码也有两种00000000B,11111111B ,而补码是唯一的,规定数0的补码形式为00000000B(+0)。
由于最高位用作符号位,所以8位字长的计算机表示不到-128,即-128的原码反码都不存在。 规定唯一数-128补码为10000000B(-0)
其它字长的计算机可以此类推。

4、浮点数的表示

与浮点数相对应的定点数是指小数点固定不动的小数,可分为纯整数和纯小数两种。浮点数可由两种定点数组合而成。

任何一个二进制浮点数可以表示为 2 j ∗ S 2^j*S 2jS, 其中S称为尾数,j称为阶码。可将浮点数看成由阶符、阶码、数符、尾数四个部分组成。阶符表示阶码的正负号,用一位二进制数表示,0便是正号,1表示负号;数符与阶符同理,表示尾数的正负号;尾数一般为纯小数。
将十进制浮点数转化为二进制规格化数可以分为如下三个步骤:
1、将十进制数转化为二进制数。
2、移动小数点,记下移动方向与次数。
3、按阶符、阶码、数符、尾数顺序书写。

看个例题:

5、其它

(1)数的运算
二进制数的算数运算与十进制的运算相似,运算规则逢二进一。逻辑运算包括与、或、非、异或等等。可以参考这里逻辑运算、编码

补码运算: [ X + Y ] 补 = [ X ] 补 + [ Y ] 补 [X+Y]_{补}=[X]_补+[Y]_补 [X+Y]=[X]+[Y] [ X − Y ] 补 = [ X ] 补 + [ − Y ] 补 [X-Y]_{补}=[X]_补+[-Y]_补 [XY]=[X]+[Y]
当两个符号相同的补码数相加时,需要注意溢出问题。分为两种情况:两个正数相加时结果变成了负数,或两个负数相加变成了正数。

参考
为何计算机使用原码反码补码

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值