字母和数字是通过ASCII码来编码的。 汉字的描述方法(汉字的编码):
区位码——标准GB2312
定义了一个94*94的二维数组,每一个数组位存一个汉字 用区号位号来定位。分别用两位十进制数来表示区号和位号。 在计算机中用数字编码输入的优点是没有重码,缺点是难以记住。
国标区位码:
将区位码中的区码和位码分别转化成16进制数,再分别加上20H(十六进制的20),占两个字节。
为什么要加上20H?
因为前面1FH已经分配给数字字母和控制字符了。
“中”位于 第54区 48位, 区位码是 5650H。十进制的54换算到十六进制是36H,加上20H就是56H,十进制的48换算到十六进制是30H,加上20H就是50H。 汉字ASCII码(汉字机内码): 将汉字国标码分别加上8080H 80H = 10000000B(二进制数),后面的位不变,最高位从0变成1,这样是为了与原来的ASCII码区分开来,原来的ASCII的最高位是0。
汉字打印出来的用字模码存储点阵阵列来实现的。
数字的表示方式:
最高位是1表示为负数,是0表示是正数。计算机并不知道它是正还是负,它只知道这一位是高电平还是低电平。 没有用一个位来标识小数点。 定点数的表示方法:
定点数:小数点的位置是固定的位置。还是有符号位的。 小数点固定在最低有效位的右边,则是定点整数。 小数点固定在最高有效位的左边,则是定点小数。
在使用的时候会提前有个信息告诉计算机读取的是小数还是整数,所以1100和0.1100在计算机内的存储是一样的。
为了书写和理解的方便,在符号位和实际数之间加个逗号表示定点整数,在符号位和实际数之间加小数点表示定点小数。
1,1100B = -12
1.1100B = -0.12 若是原码表示是 (-0.75) 定点数补码的表示方式
不仅是二进制数可以用补码把减法变成加法来运算,其他进制数也可以用补码来把减法变成加法来运算。
时钟把时针从5调到3,可以用5 – 2 = 3,也可以有5 + 10 = 3 10是(-2)在模为12下的补码。
负数求补码:对于R进制数N,这个数有d位,那么它的补码就等于R的d次方减去它
本身的绝对值。
对于十进制数: 55 – 35 = 20
55 + (100 - 35) = 120(对100取模) = 20
对于固定点表示方式的二进制数,不管是整数还是小数,正数不变,负数就相当于所有位取反再加1。或者从最低有效位开始向左边移动,遇到第一个1前保持不变,遇到1后,该1不变,左边的都取反。
n位固定点整数的范围:?2n?1~2n?1?1 n位固定点小数的范围:?1~1?2?(n?1)
对于8位的固定点数,不管是整数还是小数,最小的数:10000000 8位固定点小数的11111111表示的是-1。
溢出:运算的结果超过了给定的n位表示的范围。 判断溢出:
1、 两个整数相加变成负数 2、 两个负数相加变成正数
简单判定方法:次高位和最高位同时产生或者同时不产生进位,则没有溢出,如果只有一个发生进位,则发生溢出
双符号位:用两个位来标志符号,00表示正数,11表示负数。
这样可以更快地看出是否发生溢出,如果符号位不是00或者11,则发生了溢出,而且能从最高符号位判断出:如果没有发生溢出,则它的运算结果是正数还是负数。
浮点数的表示方法:
对于小数,更多的是通过浮点的表示方式来实现的。 一般意义上,定义的规格化的数是小数点后第一位为1的数,而我们原来学习的浮点数(754标准)为了扩大表示数的范围,默认了第一位就是1而不加以表示,所以少表示了一位:
17(10)?0.10001(2)?25
为什么8位的指数,移码是127而不是128,因为把全0和全1的两个预留出来了,就只剩下254种情况,所以只有254/2 = 127
上溢:所得的数超过了浮点数表示范围的绝对值的最大值 下溢:所得的书低于浮点数表示范围的绝对值的最小值
单精度:32位,4个单元(每个单元8位) 双精度:64位,8个单元 扩展精度:80位,10个单元 着重注意单精度数:
指数是0,位数是0,表示的数就是0
双精度数的范围:?1?10308~?1?10?308和1?10?308~1?10308
双精度数下溢(太接近0了)的时候,机器直接当做0来处理,称为机器0。上溢则要特殊对待。
无符号数的二进制数的乘法:(与十进制的乘法类似)
1101?1011
Booth Algorithm(做二进制数的乘法) 可以实现两个n位的二进制数相乘,这两个数以补码的形式出现,输出结果也是以补码的形式出现的。(补码的好处:符号位可以直接参与运算,最终也体现在结果的符号位中)
二进制数的每个位只可能是0和1,乘以一个数,只可能全是0或者被乘数本身。 如果是1则相应做移位之后的部分积加到一起。 如果是多个1连在一起,则可以变成两个数想减,如三个1则是7,变成8-1,变成2的3次方-1。 如果是1110,则变成16-2,即10000 - 00010 30a = 32a – 2a,由于32和2分别只有一位是1,做部分积求和就很方便。 把每一位变成0,+1,或者-1,比如上面的1110就变成 +1 0 0 -1 0 如何把乘数从01的编码变成0+1-1的编码:
如:0110110
1、 在最后补零,变成:01101100
2、 从右往左,相邻两位相减:从右往左数,第一位减去第二位得到0,第二位减
第三位得到-1,第三位减第四位得到0……最后得到:10-110-10
做乘法时:
1、 先把乘数从01的编码变成0+1-1的编码 2、 做乘法,注意部分积也要用补码的形式表示
关于位的扩展,如8位变成16位表示:如果是整数,那么在前面添加8个0,如果是负数,则在前面添加8个1.
计算: 0101101 x 0011110 0 1 0 1 1 0 1 x 0+10 0 0-1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 补码的形式,由于是负数,前面全部补1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 0
当乘数是0101交替出现的时候,这个算法不会提高计算效率。 设计成计算机可以处理的步骤: 上面的计算包括:求补、移位、加法 第一次部分积与全0相加得到第一次部分积,第二次与第一次得到的部分积相加得到第二次部分积之和,每次都与上一次的和相加就可以了。 A 0000 0101 下面要向右移 0010 1101 1110 0011 0001 0001 0001 Q 1101 1101 Q-1 0 0 M 1011 1011 A←A-M First cycle Initial values 1110 1110 1111 1111 1111 1111 1111 1 1 0 0 1 1 1 1011 1011 1011 1011 1011 1011 1011 Shift A←A+M Shift A←A-M Shift A←A+0 No Shift Fourth cycle (no shift in the last cycle) Third cycle Second cycle Q最开始用来保存乘数,边运算边和A一起用来保存计算结果(移位的时候把A的低位移到Q中)
除法运算:(与十进制类似,只不过不用判断倍数,只需判断大小,因为倍数最大为1) 从第一位起,每次多加一位,比较它与除数的大小,如果大则商上面加个1,如果小则商上面补个0。
如何判断大小:做减法,如果结果大于0(二进制最高位是0)则大。结果作为余数参与到下一次运算当中,如果小于零则要加回刚刚减掉的数,恢复为原来的数。
需要的寄存器:被除数(最终可以保存商)、除数、余数(初始化为0)、商
浮点数的加减乘除:
浮点数包括指数和尾数,两个部分要分开算。 浮点数的加减:
1、 指数部分要变成相同的数,尾数部分进行相应的小数点移动(最高位向左移动则称
为左规,向右移则称为右规,一般是小的指数部分向高的指数部分看齐,即右规,这个步骤称为对阶) 2、 尾数进行加减运算 3、 规格化成为浮点数 4、 舍入(0舍1入)
如何进行规格化:
101.01化成0.10101×2^3,最高位是符号位,101.01是正数,所以是0。 如果是-101.01,则化成,1.01011(补码形式取反加1) 浮点数的尾数部分的绝对值在0.5到1之间。 如果是双符号位,则
正数的形式:00.1XXXX (X可以是0或者1) 负数的形式:11.0XXXX
如果相加减发生溢出,比如结果是:
01.1XXXX,则规格化为:00.11XXXX,再乘以指数 10.0XXXX,则规格化为:11.00XXXX,再乘以指数
X?2?101? ??0.101000? Y?2?100? ??0.111011?,求X?Y
1、 将数表示成双符号位补码形式:
表格中都是用补码表示,要把指数部分跟尾数部分都变成补码的形式,而且是双符号位的补码形式。 指数部分 尾数部分 X Y 2、 对阶
11,011 11,100 11.011000 00.111011