复习点:
1.编码求法
(1)原码:正数和负数都是在直接在真值前加符号位即可(0表示正数,1表示负数)
eg.X = 1101, Y = -1011, Z = 0.1001, P = -0.1010 ,字长为5
[X]原 = 01101 [Y]原 = 11011 [Z]原 = 0.1001 [P]原 = 1.1010
(2)反码:正数的反码与原码相同,负数符号位不变,真值部分各位按位变反。
eg.X = 1111, Y = -1010, Z = 0.1011, P = -0.1001,字长为5
[X]反 = 01111 [Y]反 = 10101 [Z]反 = 0.1011 [P] = 1.0110
(3)补码:正数的补码和原码相同,负数的补码有如下两种求法
- [X]补 = M + X(MOD M)
- 先求反码,然后末位+1即可1
eg.X = 1001, Y = -1001, Z = 0.1010, P = -0.1011,字长为5
[X]补 = 01001 [Y]补 = 10111 [Z]补 = 0.1010 [P]补 = 1.0101 - 由补码求真值:正数补码的数位即真值,负数将补码去掉符号位后各位变反,末位加1,最后加上“-”即可
eg.[X]补 = 01101, [Y]补 = 10110, [Z]补 = 0.1011, [P]补 = 1.1101
X = 1101, Y = -1010, Z = 0.1011, P = -0.0011
(4)移码:只有整数有移码。补码的符号位取反就是移码
eg.X = 1001, Y = -1101,字长为5
[X]补 = 01001 [Y]补 = 10011
[X]移 = 11001 [Y]移 = 00011
2.4种机器码的特点
- 对于正数,原码,补码,反码的表示形式一样。
- 最高位一定是符号位
- 相同字长的情况下,补码和移码能表示的数的范围比原码和反码多一位,这是因为,在原码和反码中0有两种表示形式,而补码和移码中的0只有唯一形式。(多表示的那个数为负数)
- 引入补码的目的是将运算“减”化为“加”
- 引入移码是因为通过加法和移码可以实现乘除操作
- 如果真值位数小于字长,整数应该在符号位和真值之间补足位数,小数应该在末位补足位数。一定要记得是先补再转换
3.定点数学习
(1)定点整数
- 原码和反码的表示范围:-(2n-1-1) ~ 2n-1-1
- 补码和移码的标识范围:- 2n-1 ~ 2n-1-1
eg.X = -11011011, 字长为16
[X]原 = 1000000011011011
[X]反 = 1111111100100100
[X]补 = 1111111100100101
[X]移 = 0111111100100101
(2)定点小数:小数点固定在最高有效位和符号位之间的定点数,是纯小数。
- 原码和反码的表示范围是 -(1-2-(n-1))~ 1-2-(n-1)
- 补码的表示范围是:-1 ~ 1-2-(n-1)
eg.X = -0.11011101,字长为16
[X]原 = 1.110111010000000
[X]反 = 1.001000101111111
[X]补 = 1.001000110000000
(3)无符号数:表示范围是0~2n-1
4.浮点数学习
-
格式:阶符| 阶码 |数符| 尾数,一般阶符和数符各占一位
eg.N = 0.11110001×2-0101,其中0.11110001叫做尾数,0.11110001前的“+”叫数符或尾符,0101前的“-”叫阶符,0101叫阶码 -
一般形式:N = M × RE(M是尾数,E是阶码,R是尾数的基数,计算机中默认为2)
eg.设浮点数的阶码和尾数均用补码表示,且位数分别为5位和11位(均含1位符号位),将X = -27×29/32用浮点数格式表示
先将X转换为二进制:X = -27×29/2-5 = -2111×0.11101 -
一些特点:浮点数的表示范围主要取决于阶码的位数及基数,精度主要取决于尾数的位数;阶码E一般采用定点整数表示,尾数M一般采用定点小数表示
-
浮点数的规格化:规定尾数真值的绝对值小于1同时大于等于0.5的浮点数为规格化浮点数。
5.IEEE 754标准
规定第一位是符号位,阶码用移码表示,尾数用原码表示
6.补码的运算
(1)加法运算:[X+Y]补 = [X]补 + [Y]补
eg.X = 9, Y = 13,字长为8,计算[X+Y]补
[X]原 = 00001001 [Y]原 = 00001101 [X]补 = 00001001 [Y]补 = 00001101
[X + Y]补 = 00001001 + 00001101 = 00010110
(2)减法运算:[X-Y]补 = [X+(-Y)]补 = [X]补 + [-Y]补,其中求一个符号相反的数 的补码(机器负数), 将这个数的补码连符号位一起变反,末位加1
eg.X = -1111, Y = -1010, 字长为8位,计算[X-Y]补
[X]原 = 10001111 [Y]原 = 10001010
[X]补 = 11110001 [Y]补 = 11110110
[-Y]补 = 00001010 [X-Y]补 = 11111011
7.溢出判断
- 单符号运算方法:原理是异或。设运算时符号位产生的进位是Cn,最高数位产生的进位是Cn-1,若Cn⊕Cn-1 = 1(就是Cn和Cn-1不相同),溢出
- 双符号位运算方法:原理类似,只是正数的符号位用00表示,负数的符号位用11表示,当运算结果的符号位是0时,发生正溢出;运算结果的符号位是10时,发生负溢出;运算结果的符号位是00或11时,没有发生溢出
8.移位运算
(1)算术移位
-
原码移位:符号位不参加移位,左移数值高位移出,末位补0;右移数值低位移出,高位补0(当最高数位是1时,左移会丢失数的最高位,出现错误,最低数位是1时,右移会损失数的精度)
eg.X = 00000010,左移两位
结果为X = 00001000 -
补码移位:符号位参加移位,左移数的末位补0,符号位移出;右移高位补符号位,末位移出
eg.[X]补 = 11110101,左移两位;[Y]补 = 11111100,右移两位
结果为X = 11010100 Y = 11111111
(2)逻辑移位
-
逻辑左移:高位移出,末位补0;逻辑右移:高位补0,低位移出
eg.X = 10101010,左移两位
结果为X = 10101000 -
循环左移和右移:循环左移是指将移出的最高位补到最低位;循环右移是将移出的最低位补到最高位(若字长为8,那么循环左移或右移8位后,得到的数与原来的相同)
eg.X = 11010101循环左移两位 Y = 10001110循环右移两位
结果为X = 01010111 Y = 10100011