计算机组成原理2.1——进制转换,有符号数与无符号数,原码、反码、补码、移码,真值与机器数

一、r进制

r进制数:逢r进1

二、r进制转换为十进制

举例:整数二进制0010。从右往左依次是:0,1,0,0。对应的位数依次是2的0次方,2的1次方等等。所以十进制数就是0*2^0+1*2^1+0*2^2+0*2^3=2

小数二进制.0100。从左往右依次是:0,1,0,0。对应的位数依次是2的-1次方,2的-2次方等等。十进制数是0*2^(-1)+1*2^(-2)+0*2^(-3)+0*2^(-4)=0.25

所以r进制数转换为十进制,先拆分,然后将拆分的数乘以r的n次方的和。

三、二进制转换为十六进制

每4个二进制位对应一个八进制位。

四、十进制转换为r进制

对整数部分,采用除基取余法。

对小数部分,采用乘基取整法。但是需要注意,不是所有的小数都可以被计算机准确的表示。例如二进制0-1上的小数有0.1,0.01,0.001,0.0001等等,有无数个小数。而计算机存储的数字永远是有限的。

举例:十进制整数101.0625转换二进制。

第一步:将101.0625拆分成101和.0625

第二步:对101(十进制)求二进制

因为转换为二进制,所以基是2。

101/2=50...1,余数为1,

50/2=25...0,余数为0,

25/2=12...1,余数为1,

12/2=6...0,余数为0,

6/2=3...0,余数为0,

3/2=1...1,余数为1,

1/2=0...1,余数为1。

后面再用0除以2永远为0了,所以到0结束。

然后从后往前写。。。二进制为1100101.

验证:1100101(二进制)转化为十进制为:

1*2^0+0*2^1+1*2^2+0+0+1*2^5+1*2^6=1+4+32+64=101

第三步:对十进制小数.0625转换为二进制。

因为转换为二进制,所以基是2。

0.0625*2=0.125,整数为0,

0.125*2=0.25,整数为0,

0.25*2=0.5,整数为0,

0.5*2=1.0,整数为1,

然后从前往后写,往前加小数点。。。二进制为.0001

验证:0*2^(-1)+0*2^(-2)+0*2^(-3)+1*2^(-4)=0.0625

第四步:组合起来就是1000101.0001

五、有符号数与无符号数

通过上述讲解,我们知道一个二进制数的表示,知道如何将一个十进制转化为二进制。

例如:101(10)转化为二进制为1000101(2)。这里(10)代表十进制数,(2)代表二进制数。

这是一个无符号数,也就是自然数(0,1,2...)。当写C语言语句时必须加上unsigned。

那么一个负数应该怎么表示?这里引入无符号数。

令无符号数二进制序列前面多加一个符号位。0代表正,1代表负。如-101(10),可以写成:

11000101(在前面加个1)。同理,有符号的整数+101表示为01000101(在前面加个0)

总结:

无符号数,只能表示自然数0,1,2...。并且二进制有几位算几位。例如101(10)=1000101(2).

有符号数,在无符号数前面加一个符号位。(0为正,1为负)。例如:

+101(10)=01000101(2)

-101(10)=11000101(2)

(红字为符号位)

六、原码,反码,补码,移码

四者相同点:原码,反码,补码,移码都是有符号数,所以都有符号位。

6.1 原码

在第五部分的有符号数的表示中,全是原码。如

+101(10)=01000101(2)

-101(10)=11000101(2)

(红字为符号位)

其中,01000101(2)和11000101(2)这两个二进制序列全是原码。

原码是为了人能理解的二进制序列。我们通过看原码能迅速想到真值(我们熟悉的十进制数)。

例如:我们看到二进制数0001,能快速想到原来的十进制数为1。

6.2 反码

反码计算方法:如果是正数和原码一样,如果是负数原码除了符号位,其余位全部取反。(知道这个就行了,不是重点)

例如:原码01000101(2)。符号位为0,是正数,那么反码也是01000101(2).

原码11000101(2)。符号位为1,是负数,那么保留符号位,其余位取反。反码就是10111010(2).

6.3 补码

补码计算方法:如果是正数和原码一样,如果是负数原码除了符号位,其余位全部取反,末位加1.

例如:

原码01000101(2)。符号位为0,是正数,那么补码也是01000101(2).

原码11000101(2)。符号位为1,是负数,那么保留符号位,其余位取反,末位加1。前两步和反码一样,反码是10111010(2),然后末位加1,补码就是10111010+1=10111011(2)

补码是计算机用的。

补码转原码:如果是负数,保留符号位,其余位取反,末位加1。(和原码转补码一模一样)

x的补码转-x的补码:包括符号位,全部取反,末位加1。例如1的补码是0001,-1的补码是1111.

6.4 移码

移码计算方法:补码的符号位取反,其余不变。

例如:补码01000101,补码的符号位取反,其余不变,所以移码是11000101.

补码10111011(2),移码是00111011(2)

6.5 取值范围

通过上节,我们知道存储字长:二进制序列保存到一个个存储单元中,存储单元中的位数就是存储字长。现在设存储字长为4,也就是每个存储单元只能存4个二进制数,如0000,0001,...,1111

在4位的情况下,探讨原码、补码、移码的取值范围(反码不重要)。

先看0的情况

原码:因为第一位是符号位,所以原码中0000和1000都是0,一个是+0,一个是-0。(人看的)

反码:符号位不变,数值位取反。原码一个是+0,一个是-0。所以反码也是一个+0一个-0.

补码:补码中只有0000是0,规定1000是-8(机器看的)

移码:移码和补码符号位相反,所以1000是0,0000是-8。

再看最大值和最小值:

原码:因为第一位是符号位,所以原码中第一位0开头是正数,1开头是负数。所以后三位取最大,前面带上0就是最大整数,带上1就是最小整数。最大:0111(2)=7(10),最小:1111(2)=-7(10).

4位原码取值范围:[-7,7],0包括0000和1000。取值范围也可以写成[-(2^3-1),2^3-1]

补码:因为规定1000是-8。通过计算1001是-7,1010是-6...0000是0,0001是1...,计算如下:

1001(补)=1111(原)=-7(补码转原码:保留符号位,其余位取反,末位加1)

4位补码取值范围:[-8,7],0只有0000,-8是1000。取值范围也可以写成[-(2^3),2^3-1]

4位补码取值范围对应的二进制,[1000,1001,1010...0000,0001,0002,...]

移码:移码和补码只有符号位变化。所以1000(补)=0000(移)=-8

4位移码取值范围:[-8,7],0只有1000,-8是0000。取值范围也可以写成[-(2^3),2^3-1]

4位移码取值范围对应的二进制,[0000,0001,0010...1000,1001,1002,...]

七、真值与机器数

真值:我们最熟悉的数,十进制数,做题中一般需要真值和原码相互转换。

机器数:计算机保存的数,也就是补码。

真值和机器数的转换:

真值->机器数:把真值(十进制)->二进制(原码)->补码-十六进制数(一般用16进制表示)

八、例题

1.十进制数为137.5,则八进制为()

答案:211.4

解析:十进制转化为r进制。

对整数部分,采用除基取余法。137/8=17...1,17/8=2...1,2/8=0...2.

从右往左写,211

对小数部分,采用乘基取整法。0.5*8=4.0,整数为4;

组合:211.4

2.下列说法错误的是:

A.任何二进制整数都可以用十进制表示

B.任何二进制小数都可以用十进制表示

C.任何十进制整数都可以用二进制表示

D.任何十进制小数都可以用二进制表示

答案:D

解析:在计算机中,整数是连续的,小数是离散的。不是任何一个十进制的小数都能化为二进制。例如二进制0-1上的小数有0.1,0.01,0.001,0.0001等等,有无数个小数。而计算机存储的数字永远是有限的。

3.对真值0表示形式唯一的机器数是

A.原码

B.补码和移码

C.反码

D.以上都不对

答案:B

解析:原码中0000和1000都是0,一个+0,一个-0.反码也是一个+0,一个-0,补码中只有0000是0,移码中只有1000是0.

4.若补码[x]=1.11010110,则原码x=()

答案:1.00101010

解析:补码转原码,1开头是负数。保留符号位,其余取反,末位加1.

先取反为:1.00101001,末位加1:1.00101010

5.若x为负数,由x的补码转换为-x的补码,需要将

A.x的补码各值不变

B.x的补码符号位取反,其他位不变

C.x的补码除符号位,其余位取反,再加1

D.x的补码包括符号位全部取反,再加1

答案:D

解析:举例设x为-1,x的原码是1001,x的补码就是1111;-x是1,-x的原码是0001,-x的补码是0001.

6.8位原码能表示的不同数据有( )个

A.15

B.16

C.255

D.256

答案:C

解析:4位原码能表示的范围是-7-7,总共有15个数据,也就是2的4次方-1,因为0用了两次。所以8位原码就是2的8次方-1=255.

7(考研题).由3个"1"和5个"0"组成的8位二进制补码,能表示的最小整数是()

A.-126

B.-125

C.-32

D.-3

答案:B

解析:他是8位二进制补码,要找最小整数。先想4位二进制补码的取值范围,

4位补码:1000,1001,1010,...,0000,0001,0010,...

分别对应的值是:-8,-7,-6,...,0,1,2,...

发现开头第一位为1的小,是负数。后三位越小,数也越小。如1000是-8最小。

这个8位二进制是由3个"1"和5个"0"组成,找最小整数。先拿一个1放第一位,后面7位尽可能的小即可,后7位最小是0000011。组合在一起就是10000011(补码),记住这是组成的二进制补码。

我们要找的是真值,也就是原码对应的十进制数。把10000011(补码)转换为原码,因为是负数,符号位不变,其余位取反,末位加1。原码就是11111101。对应的十进制是-125.

8(考研题).short型变量x=-8190,则x的机器数为(   )

答案:E002H

解析:先把-8190(十进制)转化为二进制。先把8190采用除基取余法,求得1 1111 1111 1110(12个"1",1个0).

short型变量为16位数,8190占13位数,-8190需要往前补一个1(负数),两个0,那么-8190是1001 1111 1111 1110(原码),

-8190原码转化为补码,符号位不变,其余位取反,末位加1。结果:1110 0000 0000 0010(补码),

补码转化为十六进制,每4位为十六进制的一位,所以就是E002,最后加个H,表示为十六进制,最后结果就是E002H

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值