6

不得不知道的补码知识 | 月光中的污点

 2 years ago
source link: https://www.extlight.com/2021/05/31/%E4%B8%8D%E5%BE%97%E4%B8%8D%E7%9F%A5%E9%81%93%E7%9A%84%E8%A1%A5%E7%A0%81%E7%9F%A5%E8%AF%86/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
不得不知道的补码知识 | 月光中的污点

无论什么编程语言,其代码最终都会被编译解释成计算机可读取和运行的二进制数据。

其中,数字在二进制数据中可划分成原码、补码和反码。

一、表示法

原码:数值前面增加一位符号位

例如:10 和 -10 的二进制表示如下:

# 10 的原码
0000 1010

# -10 的原码
1000 1010
复制

其中,最高位表示符号位,0 表示正数,1 表示负数。

反码:在原码的基础上,符号位不变,其余位取反

继续以上边的 -10 为例:

# -10 的反码
1111 0101
复制

补码:负数的补码为反码加1,正数的补码就是原码本身

# 10 的补码
0000 1010

# -10 的补码
1111 0110
复制

在计算机中,数字是以补码的形式进行存储和运行的。

二、补码的意义

相对于原码,使用补码作为计算机的实际存储方式有 2 个优势:

  1. 可以统一数字 0 的表示。因为 0 既不是正数也不是负数,如果使用原码表示,最高位的符号为难以确定用 0 还是 1 表示。

如果用补码表示,我们先把 0 当作正数处理,其补码(原码本身)表示如下:

0000 0000
复制

我们再把 0 当作负数表示,其补码(反码 + 1)表示如下:

# 原码
1000 0000

# 反码
1111 1111

# 补码
0000 0000
复制

从上边可以看到,以补码表示 0,无论从正数还是负数角度处理,最终数字的二进制表示都是一样的。

  1. 简化加减法的计算。将减法当成加法进行计算,实现正数和负数加法的统一。

我们以 2 + 3 为例:

2 的补码: 0000 0010
3 的补码: 0000 0011
结果: 0000 0101
复制

结果中的 0000 0101 就是十进制的 5。

我们以 2 - 3 为例:

 2 的补码: 0000 0010
-3 的补码: 1111 1101
结果: 1111 1111
复制

结果中的 1111 1111 就是十进制中的 -1。

从上边的例子中我们可知,使用补码表示数字时,我们无需区分正负数,只需将补码进行加法运行即可得出结果。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK