原码、反码、补码、浮点数编码

1. 原码

直观理解:

原码是表示整数的一种最简单方式,它直接用一个位(0 或 1)来表示符号:

  • 0 表示正数
  • 1 表示负数

剩下的位数用来存储数字本身的绝对值。

举例:

假如有 8 位(8 bits):

  • +5 表示为:00000101
    • 第一个 0 表示正号
    • 后面 0000101 表示数字 5 的二进制
  • -5 表示为:10000101
    • 第一个 1 表示负号
    • 后面 0000101 表示数字 5 的二进制

特点:

  • 表示简单,但计算(例如加减)会很麻烦。

2. 反码

直观理解:

反码是对负数的一种编码方式,规则如下:

  1. 正数的反码和原码相同
  2. 负数的反码:符号位不变,其余各位按位取反(0 变 1,1 变 0)。

举例:

以 8 位表示:

  • +5 的反码:00000101(和原码一样)
  • -5 的反码:
    • 原码:10000101
    • 反码:11111010(符号位保持 1,后面取反)

特点:

  • 解决了负数表示的问题,但加减法时仍然复杂。

3. 补码

直观理解:

补码是目前计算机中普遍使用的一种编码方式。规则是:

  1. 正数的补码和原码相同
  2. 负数的补码:在反码的基础上末位加 1

为什么用补码?

补码的好处是:

  • 加减法运算简单(正负数加减统一了规则)。
  • 补码可以唯一表示 0(反码有两个 0)。

举例:

以 8 位表示:

  • +5 的补码:00000101(和原码一样)
  • -5 的补码:
    • 原码:10000101
    • 反码:11111010
    • 补码:11111011(在反码基础上 +1)

补码的本质:

它让负数看起来像很大的正数。
比如:-5 的补码是 11111011,其实是用 “二进制 251” 来代表 -5。

4. 浮点数编码

浮点数是用来表示带小数点的数字(比如 3.14 或 -0.01)。因为小数点的位置可以 “浮动”,所以叫 “浮点数”。

编码方式:

浮点数用科学计数法表示,比如:
−2.5=−1.25×101-2.5 = -1.25 \times 10^1
在计算机里,它会被拆成三个部分:

  1. 符号位(Sign,1 bit):表示正负号,0 是正,1 是负。
  2. 指数部分(Exponent,若干 bits):表示小数点的位置。
  3. 尾数部分(Mantissa,若干 bits):表示有效数字。

举例:

假如用 32 位浮点数表示 -2.5(按照 IEEE 754 标准):

  1. 符号位 S:1(负数)
  2. 指数 E:用偏移量方式编码,假如偏移量是 127,则 E=127 + 指数值 E = 127 + 指数值
    • 这里指数是 1,所以 E=127+1=128E = 127 + 1 = 128,即二进制 10000000
  3. 尾数 M:2.5 写成 1.25×211.25 \times 2^1,小数部分 0.25 转成二进制是 01,结果是 0100000...(填充到 23 位)。

最终编码是:

1
2
符号位   指数   尾数  
1 10000000 01000000000000000000000

总结对比:

编码方式 适用范围 示例 主要特点
原码 整数 -5 = 10000101 符号位简单,计算麻烦
反码 整数 -5 = 11111010 解决符号问题,但加减仍复杂
补码 整数 -5 = 11111011 统一加减法,计算机主流使用
浮点数 小数 -2.5 = 1 10000000 010... 表示范围大,但格式复杂