原码,反码,补码和移码
无符号数
- 定义:没有符号位的数值,存储单元的所有bit都用来表示数值
- 缺点:表示范围小,不能不表示负数,只能表示正数
- 相关的计算:
- 根据存储单元的位数确定存储单元的存储范围
以八位为例子:存储单元有8bits,则其存储的最大数:1111 1111 对应的十进制数是 (2 8 - 1) = 255,最小的数:0000 0000 对应的十进制数为0。
有n个bit用于存储数字,则其存储范围是:0 —— (2n - 1) - 将对应的十进制转成二进制
类比于十进制中的个位,十位,百位的概念,二进制也有自己的位数。 可以将一个十六进制的拆结成对应的组合。
- 根据存储单元的位数确定存储单元的存储范围
个位 | 十位 | 百位 |
---|---|---|
100 = 1 | 101 = 10 | 102 = 100 |
第一位 | 第二位 | 第三位 | 第四位 | 第五位 | 第n位 |
---|---|---|---|---|---|
20 = 1 | 21 = 2 | 22 = 4 | 23 = 8 | 24 = 16 | 2^n - 1^ |
有符号数
- 真值:+/- 二进制数,如-0.0001,用正负号来表示正负数
- 机器数构成:符号位,小数点位置,数值部分
- 符号位默认是数据段的最高位,0表示正数,1表示负数
- 小数点位置:不用特定的字符去表示小数点,而是采用约定的方式
- 整数:小数点与数值位最后。
- 小数:小数点在符号位和数值位之间。
- 数值部分的表达方式:原码表示,补码表示,反码表示,移码表示
原码表示
- 结构:整数:符号位 + 数值部分(二进制)
小数:符号位+数值部分(二进制) - 整数:
- 小数:
- 原码的问题总结:
- 在将真值转成机器字时,先明确所给的机器字长,符号位,不够的的地方注意补位
- 原码的0无论是小数还是整数都有两种表示方式,分别是正零和负零,浪费了一个空间,而且同一个零,有了二义性
- 原码不便于做减法运算
原码改进——补码
- 问题引入:在时钟上将五点调到三点,除了减两个小时,还可以加上10个小时,时钟运算具有周期性,以12为模,超过十二,自动减去12.
同样的,当存储器在进行加法运算时,超过自身表示的上限,也会减去自身的模。所以补码提供了将减法变为加法的方法
- 一个负数,加上模等于其补数,五点到三点,-2 等于加上10,所以-2的补数是10点
- 补码的定义:
- 整数:
【1】 这里是在真值的情况下,在整数的位数加一位的情况下进行运算,加上整数位数以及符号位,多余的自动舍去
【2】 注意这里是2的n+1次方,x是二进制的真值部分,不是原码 - 小数:
- == 注意计算机中对小数和整数的存储字长,超过的存储字长的自动舍弃==
- 整数:
求补码的方法
根据定义直接计算
得出最终的结果包括符号位
有原码直接求补码
-
正数的补码是自身;
-
负数的补码是除了符号位之外,所有的数值位取反,然后总体加一。
-
根据如下
补码的重要性质
- 补码的补码是自身,根据补码求原码,直接对补码再求补码即可得到原码
- 正数的补码,原码是自身,负数的补码是原码除符号位之外全部取反,再加一
- 补码的零仅仅只有一种表示方式,同时负数比正数多一个极小的负数,1,00000,而该数在原码中无法表示
- 通过补码,将减法运算转换为加法运算。
反码的表示
- 反码的定义
- 整数
反码变为补码的末尾1,不在加,所以,减一 - 小数
- 反码的求法
- 用定义对真值进行加减运算
- 原码除符号位,数值部分全部取反
- 反码的性质
- 反码存在两种0,分别是正零0,000000,负零1,111111
- 正数的原码,反码和补码是相同的,负数的补码是依次取反的
- 反码的反码是本身,同补码,补码的本身是自身
三码小结
- 最重要的性质:通过y的补码,求-y的补码
包括符号位,每位取反,末位加一 - 三种码值相比较
移码——用于直观的比较大小
- 问题引入
仅仅通过比较补码,难以直观的比较出两个数的大小关系,不便于做加减法运算,所以用移码表示。 - 给真值加上最大数,负数变为正数,正数变得更大,易于直观比较
- 定义:
- 注意1:无论正数还是负数,都是加上2n
- 注意2:只有整数的移码,没有小数的移码
- 移码的求法
- 按照定义进行计算
- 补码和移码只是符号位相反,其余完全相同
5. 补码和移码的比较
6. 移码的零有一种表示方式,移码从零开始,一直到最大的数
7. 用移码表示浮点数的阶数