不得不知道的补码知识 | 月光中的污点
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 个优势:
- 可以统一数字 0 的表示。因为 0 既不是正数也不是负数,如果使用原码表示,最高位的符号为难以确定用 0 还是 1 表示。
如果用补码表示,我们先把 0 当作正数处理,其补码(原码本身)表示如下:
0000 0000复制
我们再把 0 当作负数表示,其补码(反码 + 1)表示如下:
# 原码复制
1000 0000
# 反码
1111 1111
# 补码
0000 0000
从上边可以看到,以补码表示 0,无论从正数还是负数角度处理,最终数字的二进制表示都是一样的。
- 简化加减法的计算。将减法当成加法进行计算,实现正数和负数加法的统一。
我们以 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。
从上边的例子中我们可知,使用补码表示数字时,我们无需区分正负数,只需将补码进行加法运行即可得出结果。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK