计算机中的数制和编码
1.无符号数的表示及运算
-
1> 无符号数的表示
其实这部分没什么好说的,首先就是十进制,二进制,十六进制,八进制各自的定义,无非就是逢N进1这种东西.还有就是如何计算各种进制所表示的数的真值是多少.这里只需要注意不要粗心运算错误就好了.最后,n位二进制无符号数的表示范围是:0 ~ (2^n-1) -
2> 各种数制的转换
十进制转其他进制:
整数部分:除N取余法; 小数部分:乘N取整法其他进制转十进制:
其实就是求真值,这个不用多说二进制,八进制,十六进制之间的相互转化:
因为2^ 3=8, 2^ 4=16, 所以实际上二进制的三位就可以表示八进制的1位.二进制的四位可以表示十六进制的一位 -
3> 二进制的运算
二进制的算数运算就不说了,不需要说
然后是二进制的逻辑运算,与(AND),或(OR),非(NOT)也不用说,大家都知道.这里主要说一下异或(XOR),即:两逻辑变量相同得0,不一样得1
2.有符号数的表示及运算
通常的,对于有符号数,最高位为符号位,其余位为数值位,在符号位中,用"0"表示正,用"1’表示负.
我们把一个数及其符号位在机器中的一组二进制数表示形式称为**“机器数”.机器数所表示的值称为该机器数的"真值"**.
有 原码,反码,补码三种方式表示机器数
-
1> 机器数的表示方法
原码: 正数:符号位为0,其他位是真值本身;负数:符号位为1,其他位是真值的绝对值
范围: -((2^ n-1) - 1) ~ ((2^ n-1) - 1)反码: 正数:与其原码相同;负数:符号位不变(仍为1),数值位按位取反
范围: -((2^ n-1) - 1) ~ ((2^ n-1) - 1)补码:正数:原码=反码=补码;负数:在原码的数制为取反后+1,或者直接在反码的基础上加1;
范围: -(2^ n-1) ~ ((2^ n-1) - 1) -
2> 机器数与真值之间的转换
原码转化为真值:将原码的数值为各位按权展开求和,由符号为决定正负,即可求得真值
反码转化为真值:先求出反码对应的原码,再根据上面的方法求真值
补码转化为真值:先将补码转化为原码;正数的补码与原码相同,负数补码的原码是对负数再次求补.
注意:当补码为10000000,作为负数最小值时,不能用上述的方法,会得到-0;应当直接取-(2^ n-1) -
3> 补码的加减运算
补码加法:两数补码的和等于两数和的补码,所以补码之间可以直接相加得到结果
补码减法:补码运算法则: [x]补 - [y]补 = [x]补 + [-y]补 = [x - y]补
经过验证,无论被减数,减数是正数还是负数,上述补码规则的运算都是正确的,由最高位向更高位的进位会自动丢失而不影响运算结果的正确性 -
4> 补码的优点
- 1.可以讲减法运算变成加法运算,因此可以使用同一个运算器实现加法和减法运算,简化了电路
- 2.无符号数和带符号数的加法运算可以用同一个加法器实现,结果都是正确的
-
5> 溢出及其判断方法
1) 进位与溢出
所谓进位,是指运算结果的最高位向更高位的进位,用来判断无符号数运算结果是否超出了计算机所能表达的最大无符号数的范围
溢出是指带符号数的补码运算溢出,用来判断带符号数补码运算结果是否超出了补码所能表示的范围.2)溢出的判断方法
1.观察法:通过参加运算的两个数的符号及运算结果的符号进行判断(例如两个正数相加不可能得到负数),但这种方法只适用于手工运算时的判断
2.单符号位法: 如果符号位进位用CF来表示,当符号位向前有进位时,CF=1,否则CF=0; 数值部分最高位的进位用DF表示,该位向前有进位时,DF=1,否则DF=0;然后取CF和DF的异或值: OF = CF (XOR) DF
如果OF=1,说明溢出.若OF=0,则没有溢出,也就是说:当符号位和数值最高位同时有进位或同时没有进位时,结果不溢出.否则结果溢出
3.信息的编码
- 1> 二进制编码的十进制数(BCD编码)
BCD码: 将1位十进制的0~9这十个数字分别用四位二进制码的组合来表示,在此基础上可以对任意十进制数进行编码
1) 压缩型BCD码: 用一个字节表示两位十进制数,即每四位表示一个十进制数.(例如10000110B表示十进制数86)
2) 非压缩型BCD码: 用一个字节表示一位十进制数,高四位总是0000,低四位用0000~1001中的一个组合来表示 0 ~ 9中的某一个十进制数
说明:虽然BCD码可以简化人机联系,但它比纯二进制编码效率低.
2> ASCII字符编码