文章目录

  • 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,共 二进制schema 编辑器_编码
  • 无符号数进行计算时,如果运算结果超出取值范围,就会产生错误,这种情况称为溢出。
  • 例如:[200] + [100] = 11001000B + 01100100B = 00101100B = [44]
  • 计算结果应该为 300,超过了 8 位二进制数的取值范围 [0 ~ 255],从而得到错误的结果 44。
  • 无符号数编码的的加法/减法通过最高位的进位/借位来判断。

3. 符号数编码

符号数,编码时就要考虑符号编码了,不仅要表示真值的绝对值,还要表示真值的符号。
针对符号数有四种编码方式:

  • 原码:最高位表示符号(正数用 0 表示,负数用 1 表示),其他位表示真值的绝对值。
  • 反码:正数的反码等价于原码,负数的反码就是将原码除符号位以外的其他绝对值部分按位取反。
  • 补码:正数的补码依旧等价于原码,负数的补码是将反码加1得到。
  • 移码:移码在补码的基础上增加了一个偏移量。

3.1 原码

早期计算机使用原码表示法,X 为真值,n 为二进制数的位数,原码定义如下:
二进制schema 编辑器_计算机基础_02
最高位表示符号(正数用 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 为二进制数的位数,反码定义如下:
二进制schema 编辑器_二进制_03
正数的反码等价于原码, 负数的反码就是将原码除符号位以外的其他绝对值部分按位取反,故得名反码。

  • 例如:-3 的原码为[1000 0011B] ,它的反码为 [1111 1100B]

反码特点:

  • 符号位一起参与加、减运算。
  • 加法进位需要送回到最低位再加(循环进位)。
  • 减法借位需要送回到最低位再减(循环借位)。
  • 减法可以转换为加法,简化了算数逻辑单元的设计。
  • 0 的反码也有两个,即 [0000 0000B][1000 0000B]
  • 8 位二进制数可以表示 0000 0000B ~ 1111 1111B,即 -127 ~ +127,共 255 个数。

3.3 补码

反码较好地解决了符号参与运算的问题,但循环进位/借位延长了计算时间,为了进一步简化,引入了补码。X 为真值,n 为二进制数的位数,补码的定义如下:
二进制schema 编辑器_二进制schema 编辑器_04
正数的补码依旧等价于原码,负数的补码是将反码加1。

  • 例如:-3 的原码是 [1000 0011B],反码为 [1111 1100B],补码为[1111 1101B]

    补码的特点:
  • 与反码一样,补码的符号位参与加/减运算,但回避了循环进位/借位。
  • 与反码一样,补码的减法运算可转化为加法运算。
  • 0的补码只有一种,即 二进制schema 编辑器_反码_05,所以补码可以表示 -128~+127,其中二进制schema 编辑器_二进制_06不再表示 0,而是表示 -128

补码判断溢出使用双高异或判别法,如果最高位进位/借位与此高位进位/借位不同,则表示溢出。

  • 例如 120 + 16 时,
    二进制schema 编辑器_编码_07
  • 次高位产生进位,为 1 ,最高位没有产生进位,为 0,二进制schema 编辑器_计算机基础_08,说明溢出。

3.4 移码

移码在补码的基础上增加了一个偏移量,X 为真值,n 为二进制数的位数,补码的定义如下:
二进制schema 编辑器_二进制_09
以 8 位二进制为例,则:.
二进制schema 编辑器_编码_10
二进制schema 编辑器_反码_11


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