重温计算机组成原理:原码、反码、补码、移码
原码
原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。
原码不能直接参加运算,可能会出错。例如数学上,1+(-1)=0,而在二进制中
原码00000001+10000001=10000010,换算成十进制为-2。显然出错了。
反码
反码通常是用来由原码求补码或者由补码求原码的过渡码,反码就是原码各位取反(符号除外)。反码由于0有正负之分,所以没办法参加运算。
[+1] = [00000001]原 = [00000001]反[-1] = [10000001]原 = [11111110]反
补码
补码是计算机把减法运算转化为加法运算的关键编码。
补码的表示方法是:
- 正数的补码就是其本身
- 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].
因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-2^31, 2^31-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.
移码
计算机中如何判断一个数是否为“机器零”有两条件,分别为当浮点数尾数为0时,不论其阶码为何值按机器零处理;另外,当浮点数阶码等于或小于它所表示的最小数时,不论尾数为何值,按机器零处理。阶码都是整数,为了机器好判断设置了移码.