一、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