文章目录
- 1. 整数的二进制编码
- 2. 无符号数编码
- 3. 符号数编码
- 3.1 原码
- 3.2 反码
- 3.3 补码
- 3.4 移码
- 4. 总结
从康拉德·楚泽在 Z-3 计算机中首先采用二进制计数以来,现代电子计算机都采用二进制编码。
- 二进制是最基本的进位计数系统,只有 0 和 1,容易表达。
- 二进制运算规则简单,可以通过逻辑和移位电路实现。
二进制虽然表达简单,但其内容与数位却不方便识别。
- 4 位二进制可以表示 1 位十六进制。
- 有时会用十六进制数来替代二进制数,能够更方便识别二进制的内容与位数。
- 必须注意:十六进制只是用于方便识别二进制数的内容与数位,计算机并不存在这些十六进制数。
1. 整数的二进制编码
针对数值信息(数学值)的编码,将数值本身值称作真值,将编码称为机器数。
- 例如:将数字 8 编码为 1000,那么 8 称为真值,1000 称为机器数。
- 计算机中定义了两种整数:无符号数和符号数。
2. 无符号数编码
无符号数,顾名思义是没有符号的数,编码时无需考虑符号位的编码。可以直接用真值的二进制形式作为机器数,即编码值。
- 8 位二进制可以表达十进制中的 0 ~ 255,共
- 无符号数进行计算时,如果运算结果超出取值范围,就会产生错误,这种情况称为溢出。
- 例如:[200] + [100] = 11001000B + 01100100B = 00101100B = [44]
- 计算结果应该为 300,超过了 8 位二进制数的取值范围 [0 ~ 255],从而得到错误的结果 44。
- 无符号数编码的的加法/减法通过最高位的进位/借位来判断。
3. 符号数编码
符号数,编码时就要考虑符号编码了,不仅要表示真值的绝对值,还要表示真值的符号。
针对符号数有四种编码方式:
- 原码:最高位表示符号(正数用 0 表示,负数用 1 表示),其他位表示真值的绝对值。
- 反码:正数的反码等价于原码,负数的反码就是将原码除符号位以外的其他绝对值部分按位取反。
- 补码:正数的补码依旧等价于原码,负数的补码是将反码加1得到。
- 移码:移码在补码的基础上增加了一个偏移量。
3.1 原码
早期计算机使用原码表示法,X 为真值,n 为二进制数的位数,原码定义如下:
最高位表示符号(正数用 0 表示,负数用 1 表示),其他位表示真值的绝对值。
- 例如
[1000 0100B]
,最高位符号位是 1,表示负数,绝对值部分[000 0100B]
表达 4,组合起来表达 -4。原码特点:
- 乘除运算比较方便,单独处理符号与真值绝对值。
- 加减运算比较复杂,首先处理符号,确定做加法还是减法,如果是减法,还需比较真值的大小,确定结果的符号。
- 特殊数字 0 的原码有两个,判断是否为 0 需要分别判断
[+0] = [0000 0000B]
和[-0] = 1000 0000B
。- 8 位二进制数可以表示
0000 0000B ~ 1111 1111B
,即-127 ~ +127
,共 255 个数。
3.2 反码
一些老式计算机使用反码表示法,X 为真值,n 为二进制数的位数,反码定义如下:
正数的反码等价于原码, 负数的反码就是将原码除符号位以外的其他绝对值部分按位取反,故得名反码。
- 例如:-3 的原码为
[1000 0011B]
,它的反码为[1111 1100B]
反码特点:
- 符号位一起参与加、减运算。
- 加法进位需要送回到最低位再加(循环进位)。
- 减法借位需要送回到最低位再减(循环借位)。
- 减法可以转换为加法,简化了算数逻辑单元的设计。
- 0 的反码也有两个,即
[0000 0000B]
和[1000 0000B]
。- 8 位二进制数可以表示
0000 0000B ~ 1111 1111B
,即-127 ~ +127
,共 255 个数。
3.3 补码
反码较好地解决了符号参与运算的问题,但循环进位/借位延长了计算时间,为了进一步简化,引入了补码。X 为真值,n 为二进制数的位数,补码的定义如下:
正数的补码依旧等价于原码,负数的补码是将反码加1。
- 例如:-3 的原码是
[1000 0011B]
,反码为[1111 1100B]
,补码为[1111 1101B]
补码的特点:- 与反码一样,补码的符号位参与加/减运算,但回避了循环进位/借位。
- 与反码一样,补码的减法运算可转化为加法运算。
- 0的补码只有一种,即 ,所以补码可以表示
-128~+127
,其中不再表示 0,而是表示 -128补码判断溢出使用双高异或判别法,如果最高位进位/借位与此高位进位/借位不同,则表示溢出。
- 例如 120 + 16 时,
- 次高位产生进位,为 1 ,最高位没有产生进位,为 0,,说明溢出。
3.4 移码
移码在补码的基础上增加了一个偏移量,X 为真值,n 为二进制数的位数,补码的定义如下:
以 8 位二进制为例,则:.
4. 总结
- 无符号数的编码为其二进制的表达形式。
- 符号数的编码分为原码、反码、补码和移码。
- 原码:最高位为符号位,取1表示负数,取0表示正数,其他位为真值的绝对值。
- 反码:正数的反码就是原码,负数的反码为原码的符号位以外的其他位全部按位取反。
- 补码:正数的补码就是原码,负数的补码为反码加1。
- 移码:补码的基础上添加一个偏移量。
- 8 位二进制的原码、反码、补码部分表:
真值 | 原码 | 反码 | 补码 |
-128 | ^ | ^ | 1000 0000 |
-127 | 1111 1111 | 1000 0000 | 1000 0001 |
-126 | 1111 1110 | 1000 0001 | 1000 0010 |
… | … | … | … |
-3 | 1000 0011 | 1111 1100 | 1111 1101 |
-2 | 1000 0010 | 1111 1101 | 1111 1110 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
-0 | 1000 0000 | 1111 1111 | 0000 0000 |
+0 | 0000 0000 | 0000 0000 | 0000 0000 |
+1 | 0000 0001 | 0000 0001 | 0000 0001 |
+2 | 0000 0010 | 0000 0010 | 0000 0010 |
+3 | 0000 0011 | 0000 0011 | 0000 0011 |
… | … | … | … |
127 | 0111 1111 | 0111 1111 | 0111 1111 |