一、数制和编码
1.为什么计算机采用二进制?
2.进制数之间的转换
所有的其他进制数都可以用十进制表示,但反过来未必成立,比如不是所有的十进制小数都可以用二进制表示。
- 任意进制转换成十进制
按权展开相加法 - 十进制转换成任意进制
整数部分用除基取余法,小数部分用乘基取余法,从小数点处往两边。
3.真值和机器数
真值:+5,-6等。是数学层面的。
机器数:原码,补码,反码等,是计算机层面的。
4.BCD码
二进制编码的十进制数通常采用四位二进制数来表示一位十进制数中的0~9这10个数码。这种编码方法使二进制数和十进制数之间的转换得以快速进行。
- 8421码(最常用):从左到右每一位权值分别为8、4、2、1,当结果落到10-15也就是(1010)2-(1111)2之间时,需要加上6也就是(0110)2,并向高位进位。
- 余三码:在8421码的基础上加上3也就是(0011)2。
- 2421码:四位权值从左到右是2、4、2、1。
5.英文字符编码ASCII
共有128个字符,每个字符用7位编码占用一个字节(所以最高位也就是第8位为0),0~ 31 是控制字符,32是空格,33~126是可打印字符,127是DEL。
6.汉字字符编码GB
汉字的编码分为输入编码、汉字内码、汉字字形码三种。一般用两字节表示一个汉字。
- 输入编码:就是用于用户输入的编码方式,也就是拼音编码。
区位码:把汉字放在94*94的格子里,行号叫区码,列叫位码。
国标码=(区位码)16+2020H 2020H也就是32
- 汉字内码:在计算机中编码的汉字。
汉字内码=(国标码)16+8080H
国标码两个字节的最高位都是0,因为每个字节只用了前7位来表示,而ASCII码的每个字节的最高位也是1,为了区分中英文,将国标码的两个字节的最高位都改为1,就成了汉字内码。也就是加上8080H。
- 汉字字形码:也就是汉字的输出形式。
7.校验码
校验码是指能够发现或能够自动纠正错误的数据编码,也称检错纠错编码。校验码的原理是通过增加一些冗余码,来检验或纠错编码。
关于码距:通常某种编码都由许多码字构成,任意两个合法码字之间最少变化的二进制位数,称为数据校验码的码距。对于码距不小于2的数据校验码,开始具有检错的能力。码距越大,检错、纠错的能力就越强,而且检错能力总是大于等于纠错能力。
- 奇偶校验码:只能发现一位奇数位的出错情况,不能纠错。主存错误一定能检测。
在原编码上加一个校验位,它的码距为2,通过将这个校验位置为0或1来使得整个编码的1的个数为奇数或偶数(对应奇校验码和偶校验码)。
-
海明校验码:可以发现两位并纠正一位错位,使用很广泛,实际上是一种多重奇偶校验码。例题如下:
-
循环冗余码:能发现并纠正多位错误。**常用于网络层,传输大量数据。**例题如下:
二、定点数的表示与运算
1.定点数的表示
- 原码:最高位表示符号位,其余的表示绝对值。0的表示有+0=00000和-0=10000。
- 补码:真值为整数那么补码就是原码;若真值为负数,原码的符号位不变其余的取反,并且最低位+1,得到补码。0的表示是唯一的,尽管原码的0不唯一,求补码时低位+1的操作反而使得+0和-0相同了。
- 反码:和补码有一点点像但不同,如果真值是正数,反码就是原码;如果真值是负数,除符号位之外其余的取反。0的表示不唯一,因为原码0不唯一。
- 移码:在原码的基础上加上一个偏置值就得到了移码,至于偏置值,比如一共有8位,则偏置值为2^7;0的表示是唯一的。
2.定点数的运算
- 移位:
算术移位:
逻辑移位:
左移、右移都添0。
循环移位:
-
加减:需要注意的是补码加减法,同号直接相加,异号求负再相加。
-
符号扩展:需要注意的是高位添0还是1的问题,如下:
-
溢出:溢出是指运算结果超过了数的表示范围。通常,称大于机器所能表示的最大正数为上溢,小于机器所能表示的最小负数为下溢。只有两个符号相同的数相加或符号不同的数相减才可能发生溢出。
采用一位符号: 由于减法运算在机器中是用加法器实现的,因此无论是加法还是减法,只要参加操作的两个数符号相同,结果又与原操作数符号不同,则表示结果溢出。
双符号位法: 也称模4补码。运算结果的两个符号位相同,表示未溢出;运算结果的两个符号位不同,表示溢出,此时最高位符号位代表真正的符号。
采用一位符号位根据数据位的进位情况判断溢出: 若符号位的进位与最高数位的进位相同,则说明没有溢出,否则表示发生溢出。
3.C语言中的整数类型及类型转换
- 有符号数和无符号数的转换:在计算机中,同样的数值,对于有符号数以补码形式记录真值,对于无符号数以 原码形式记录真值。
- 不同字长整数之间的转换:长类型—>短类型,高位截肢;短类型—>长类型,高位补符号位数值。
4.数据的存储和排列
- **大端方式和小端方式:**现在的计算机基本上按字节编址,但是一个数据未必是一个字节装得下的,也就是说一个数据可能要分好几个存储单元才装得下,先放低位再放高位就是小端方式,先放高位再放低位就是大端方式。
-
边界对齐: 假设存储字长为32位,可按字节、半字和字寻址。对于机器字长为32位的计算机,数据以边界对齐方式存放,半字地址一定是2的整数倍,字地址一定是4的整数倍,这样无论所取的数据是字节、半字还是字,均可一次访存取出。所存储的数据不满足上述要求时,通过填充空白字节使其符合要求。这样虽然浪费了一些存储空间,但可提高取指令和取数的速度。体现的是空间换时间的思想。