思前想后:
例:
接下来我们细致理解进制之间的转换,首先我们理解下二进制,十进制,十六进制。
从我们熟悉的10进制说起,也就是逢10进1,即从0……9,当9再加1就进位。同理:
2进制即逢2进1,即从0到1,当1再加1就进位。
16进制即逢16进1,即从0……F (F就是15),当F再加1就进位。
一:2进制转换为16进制:
把二进制数从低位到高位每4位组成一组,每一组直接用16进制数来表示即可,例如:
0011 0101 1011 1111
3 5 B F
例如:
位置: 1 1 1 1
2∧3 *1 2∧2*1 2∧1*1 2∧0*1
权: 8 4 2 1
这里很好拼凑,1,2,4,8权相对应的位置只要是1,咱们加起来就可以了。
头四位(0011)末尾俩1:(1+2=3)
接着四位(0101)从右到左第1,第三位为1:(1+4=5)
接着(1011):(1+2+8=B)
最后(1111):(1+2+4+8=F)
记住1,2,4,8的顺序就好了。
所以 0011010110111111B=35BFH
(注意:十六进制数以H为后缀,十进制D,八进制O,二进制B,这里的末尾B和H是强调是什么进制的)
二:16进制转为2进制
把16进制数中每一位用4位为二进制数来表示(不足四位用0补充),即可得到相对应的二进制数,例如:
A 1 9 C
1010 0001 1001 1100
同上(在1,2,4,8中),A=2+8,所以二进制数中从右到左第2位和第四位是1,即1010
9=1+8,所以在二进制数从右到左第一位和第四位是1,即1001
三:2进制转换为10进制数
各位二进制数码乘以与其对应的权之和即为与该二进制数对应的十进制数:例如
1 0 . 1 0
2∧1 *1 2∧0 *0 . 2∧(-1)*1 2∧(-2)*0
2∧1 *1 + 2∧0 *0 . 2∧(-1)*1 + 2∧(-2)*0
=2.5
1011100.10111B = 2^6+2^4+2^3+2^2+2^-1+2^-3+2^-4+2^-5 = 92.71875D
四:10进制转换为2进制
(注意:十六进制数以H为后缀,十进制D,八进制O,二进制B,这里的末尾B和H是强调是什么进制的)
把要转换的十进制数的整数部分不断除以2,并计下余数,直到商为0为止,例如:
整数N=117D
117/2=58余1(a0=1)
58/2=29余0 (a1=0)
29/2=14余1(a2=1)
14/2=7 余0 (a3=0)
7/2=3余1 (a4=1)
3/2=1余1(a5=1)
1/2=0余1(a6=1) 用短除法更快一点
即N=117D=1110101B
对于被转换的十进制数的小数部分则应不断乘以2,并计下其整数部分,直到结果的小数部分为0为止
例如小数 N=0.8125D
0.8125*2=1.625 (b1=1)
0.625*2=1.25 (b2=1)
0.25*2=0.5 (b3=0)
0.5*2=1.0 (b4=1)
所以N=0.8125D=0.1101B
五:16进制数转换为10进制数
各位十六进制数与其对应权值的乘积之和即为相应的十进制数,例如:
N=BF3CH
=11*16^3+15*16^2+3*16^1+12*16^0
=48956D
六:10进制转换为16进制
1:可以先转换为2进制再转换为16进制
2:除法:把要转换的十进制数的整数部分不断除以16,并记下余数,直到商为0为止:例如:
N=48956D
48956/16 = 3059 余12(a0=12)
3059/16=191 余3 (a1=3)
191/16=11 余15 (a2=15)
11/16 = 0 余11 (a3=11)
所以:N=48956D = BF3CH
原码,补码,反码
原码:最高位表示符号(正数用0,负数用1),其它位表示数值位,称为有符号数的原码表示法,如图,两个原码区别就是最高位一个是0,一个是1。为什么属于有符号呢,因为他可以表示正数也可以表示负数,那你占了一个位用于表示 ± 后,表示数据大小的只能有7位了,最大为 1111 111即2∧7-1。
N=45=00101101B 【N】原码=0 0101101B
M=-45 【M】原码=1 0101101B
反码:正数的反码与原码相同,符号位用0表示,数值位值不变。负数的反码符号位用1表示,数值位为原码数值为按位取反形成,即0变1,1变0,例如:
N=45=00101101B 【N】反码=0 0101101B
M=-45 【M】反码=1 1010010B
补码:正数的补码与原码相同,即符号位用0表示,数值位值不变。负数的补码为反码加1形成,例如:
N=45=00101101B 【N】补码=00101101B
M=-45 【M】补码=11010011B
例如:11000111=-57计算方式:
最高位为1,先加负号
接着取反码+1=00111001=57
即-57
二进制加法
在这个例子当中
25 的原码:00011001 -25的补码为:11100111
32 的原码:00100000 -32的补码为:11100000
即-25等于25的反码+1
最终的结果为 11000111即-57,将其反码加1之后转化为十进制为57(验证了结果的正确性)
在这里11000111最前面应该还有个1,在这里系统将其抛弃了(但不是彻底抛弃,这里的进位被PSW寄存器里记录了,去掉他并不影响结果)
补码的表数范围
N位二进制数能够表示的 无符号整数范围:0 ~ 2^n - 1
如8位:0~255 (8个位都表示数值了,最大2^8-1)
N位二进制数能够表示的 有符号整数范围:-2^(n-1) ~ 2^(n-1) - 1
如8位:-128~127 (因为最高位0,1表示正负,其余7位才表示数值,最大2^7-1)
计算11111111转换为十进制数:
- 无符号:2^8-1=255
- 有符号:最高位是1,先确定是负数
接着取反码:0000 0000
接着+1
0000 0001 = 1
加上确定是负数,最终结果为-1
所以无符号时为255,有符号时为-1