原码

原码(True Form)表示「未经修改的码」,如果是无符号数,那么就等于该数字的二进制形式;如果是右符号数,则是二进制形式在左边加上符号位后所得到的码:

  • 若二进制数大于 0 时,符号位为 0
  • 若二进制数小于 0,符号位为 1
  • 若二进制数等于 0,符号位可以为 01(分别表示 +0-0)。

原码的整数部分与小数部分的表示又各有不同:

  • 对于整数部分,从右往左第 $k$($k$ 从 1 开始)位表示 $2^{k-1}$;
  • 对于小数部分,从左往右第 $k$($k$ 从 1 开始)位表示 $\frac{1}{2}^k$。

整数原码所能表示的范围如下:

  • 对于一个 $n$ 位的 有符号 的整数原码,其所能表示的范围是 $[-(2^{n-1}-1),+(2^{n-1}-1)]$,例如 $8$ 位所能表示的范围是 $[-127, 127]$,一共 255 个数(0 有两种表示)。
  • 对于一个 $n$ 位的 无符号 的整数原码,其所能表示的范围是 $[0,(2^n-1)]$,例如 $8$ 位所能表示的范围是 $[0, 255]$,一共 256 个数。

原码的优缺点如下:

  • (+) 编码简单,便于输入输出;
  • (-) 有符号位的时候无法直接进行运算(相加减),需要做额外处理;
  • (-) 表示范围不满0 总是有两种表示。

反码

反码 也被称为 一的补码(One's Complement),其本质其实是 改进了负数原码的表示,以允许两个有符号数直接相加减

  • 对于正数来说,其反码等于原码;
  • 对于负数来说,其反码等于将原码 除了符号位 之外的所有位进行取反操作所得到的的码。

反码的优缺点如下:

  • (+) 支持直接相加减。
  • (-) 表示范围不满0 总是有两种表示(继承自原码)。
  • (-) 人类不友好。

补码

反码 也被称为 二的补码(Two's Complement),其本质其实是 改进了负数反码的表示,整体减小 1,以避免 -0 的存在

  • 对于正数来说,其反码等于原码;
  • 对于负数来说,其反码等于将原码 除了符号位 之外的所有位进行取反操作所得到的的码。

补码的优缺点如下:

  • (+) 支持直接相加减(继承自反码)。
  • (+) 表示范围满,0 只有一种表示。
  • (-) 人类不友好。

实例

Python 实现转换

TODO

三码转换

原码 反码 补码
0
123
-123

补码加减法

溢出问题

TODO

参考