一、数制
进制:进位计数制,是指用进位的方法进行计数的数制。
数码:是用来表述数的符号。如十进制的0、1、2、3、4、5、6、7、8、9
基数:数码的个数称为"基数"或"基",通常用R表示,称为R进制。
位权:数码在不同位置上的权值。如:十进制的164,1的权值为10²,6的 权值为10的一次方,4的权值为10的零次方。
数制的表示方法:下标表示法:二进制()2 八进制()8 十进制()10 十六进制()16
后缀表示法:二进制B 八进制O 十进制D 十六进制H 如:011H
1、二进制、八进制、十六进制转化为十进制
即不同位置上的数与其权值的乘积之和
☆为什么计算机会使用二进制来存储和运算?
答:①可使用两个稳定状态的物理器件表示。
②0,1正好对应逻辑值的真、假,方便实现逻辑运算。
③可很方便地使用逻辑门电路实现算术运算。
2、十进制转化为二进制、八进制、十六进制
上图解释:十进制转化为二进制,整数部分就是将一个数不断除2,除到0,其余数从下往上组成整数部分的二进制数。小数部分就是将十进制的小数不断乘2直到结果为0(若结果一直不为0,那就截取适当位的小数),将小数乘2过程中产生的整数部分取出,从上往下读组成二进制数。
注意:十进制的整数都可以使用二进制完全表示,但是十进制的小数有的不能使用二进制完全表示。如:0.3
八进制和十六进制的与二进制的做法相同,只不过将除数和乘数换成对应的基数。
3、二进制、八进制、十六进制之间的转换
二进制中 1000表示8,10000表示16
因此二进制转换为八进制的方法为:整数部分从右边开始,每三个一组,转化为八进制,若最左边不足三位,则补零,小数部分从左边开始,每三个一组,转化为八进制,若最右边不足三位,则补零。如下:
对1011 1101.1001进行转换(绿色背景为补的零,三个一组)
01011 1101.100100
2 7 5 . 4 4
八进制转换为二进制,只需要反过来
2 7 5 . 4 4
010 111 101 . 100 100
二进制转换为十六进制的方法为:整数部分从右边开始,每四个一组,转化为十六进制,若最左边不足四位,则补零,小数部分从左边开始,每四个一组,转化为十六进制,若最右边不足四位,则补零。如下:
对1011 1101.10010进行转换(绿色背景为补的零,四个一组)
1011 1101.1001 0000
B D . 9 . 0
十六进制转换为二进制,只需要反过来
B D . 9 . 0
1011 1101 . 1001 0000
4、真值与机器数
真值:有正负号,人们日常写的数。
机器数:将正负号数字化的数,机器中使用的数。
二、定点数的编码
1、定点数与浮点数
定点数:小数点的位置固定。
浮点数:小数点的位置不固定。(像十进制中的科学计数法,有阶码)
2、无符号数
无符号数:整个机器字长的所有二进制位都是数值位,没有符号位的数。
表示范围:n位无符号数表示范围为,0~2^n-1
注意:通常只有无符号整数,没有无符号小数。
3、有符号数的定点表示
注意:可以使用原码、反码、补码来表示定点整数和定点小数,还可以使用移码来表示定点整数。
①原码
原码:用尾数表示真值的绝对值,符号位的01表示正负。
表示范围:若机器字长为n+1位,则尾数占n位。整数表示范围为,-(2^n-1)~2^n-1。小数表示范围为,-(1-2^(-n))~1-2^(-n)。
注意:1,0010011表示-19D,1.1100000表示-0.75D。注意看,符号位和数值位分割时,整数用的逗号,小数用的点。
☆真值0有+0和-0两种形式。
②反码
反码:若符号位为0,则反码与原码相同。若符号位为1,则数值位全部取反。
表示范围:若机器字长为n+1位,则尾数占n位。整数表示范围为,-(2^n-1)~2^n-1。小数表示范围为,-(1-2^(-n))~1-2^(-n)。
☆真值0有+0和-0两种形式。
③补码
补码:正数的补码=原码,负数的补码=反码末位+1
表示范围:若机器字长为n+1位,则尾数占n位。整数表示范围为,-2^n~2^n-1。小数表示范围为,-1~1-2^(-n)。
注意:规定补码1,0000000表示-2^7,规定补码1.0000000表示-1
☆真值0只有一种表示形式。
将补码->原码的方法:尾数取反,末位+1
④移码(只能用于表示整数)
移码:在补码的基础上,将符号位取反
表示范围:若机器字长为n+1位,则尾数占n位。整数表示范围为,-2^n~2^n-1
☆真值0只有一种表示形式。
作用:将移码所有二进制位看做无符号数,当真值增大的时候,移码对应的无符号数也是递增的。所以,移码表示的整数很方便对比大小。
⑤例子演示
以-19为例!
原码:1,0010011
反码:1,1101100
补码:1,1101101
移码:0,1101101
三、各种码的作用(补充)
我们要计算一个正数和一个负数的加法时,如果我们使用原码进行计算,那么结果是不正确的。所以,如果我们要让计算机算对,那么就需要在ALU中集成减法器和加法器。而减法器比加法器更复杂且所需成本更多。
如:计算-14和+14相加,原码二进制为00001110和10001110的加法,正确的结果是0,而用原码直接相加,结果是错误的。
如果,可以使用加法代替减法,那么就不需要在ALU中集成减法器,降低了成本。在数论中如果满十进一,那么9-3与(9+7)mod10的结果相同。而机器字长是固定的,这就天然的进行了取模运算。所以,只需要找到-3的补数,即与-3相加为10的数,代替-3,那么结果还是一样的。而这个数,就是-3的补码。所以当我们再去运算减法时,就可以当做加法运算。
这就是补码的作用:将减法用加法等效替换。
所以在运算时,将所有位相加,就是正确的结果。而无符号数的运算,将所有位相加也是正确的结果。所以不论是有符号数还是无符号数,运算都统一了。
如:计算-14和+14相加,补码二进制为00001110和11110010,结果为0。
四、C语言中的强制类型转换
注意:C语言中定点整数是用“补码”存储的。
无符号数与有符号数之间的转换:不改变数据内容,改变解释方式。
长整型变短整型:高位截断,保留低位。
短整型变长整形:符号扩展(有符号数进行符号扩展,无符号数零扩展)
☆什么情况下需要进行数据扩展?
①ALU的位数是固定的,所以在运算前,都需要将数据的尾数扩展到与ALU位数相同。
②寄存器的位数也是固定的,所以将数据存入寄存器时,也需要将数据扩展到与寄存器位数相同。
③主存中各个数据的长度不一定相同,所以,有时候需要进行数据的扩展。