补数与计算机中的减法

emmm 之前受到某新人的提问,自己看过也没记住。
这会读书读到这段了做个小小的记录√

二进制中表示负数的时一般会把最高位当做符号来使用,
-1这个数字其实用8bit二进制数表示就是 1111 1111。

右移

在计算机内部减法的运算 实际上 还是加法的存在的,
在表示负数时就需要用“二进制补数”。

补数就是用正数来表示负数

补数的取得方法“取反后加一”
于是 -1 的由来就是

0000 0001 —- 原始数值
1111 1110 —- 取反
1111 1111 —- +1

补数的逻辑上非常的严谨,1-1即为 1+(-1)
0000 0001 + 1111 1111 = 1 0000 0000
在这里 1 0000 0000 中开头处的1为溢出位
忽略掉 →_→(因为在 8bit的 运算中 第 9bit 会被计算机忽略掉)

如何知道负数 对应的正数呢 eg 1111 1110
此时还要使用“取反加一”
1111 1110 → 0000 0001 → 0000 0010 = 2
所以源数据即为 -2

emmm 这个东西一定是要掌握的底层基础知识呢~

继续说的话,是要说到 逻辑右移 和 算数右移
这两个的区别在于 逻辑右移仅仅需要在右移后的最高位补充 0 ,而数值右移则不是,如果是数值存在负数的情况,是需要往最高位补1。因为上面已经说啦

至于补一 右移 是可以做到如 1/2 1/4 这样的运算。
eg -4 = 1111 1100
此时作为负数的右移是 1111 1111 = -1
所以一定可以看粗来,这种运算虽然很难让人理解,但是逻辑结构确实很严谨。

至于逻辑右移为什么不需要用1来补位(试图蒙混过去)因为时纯逻辑位移了并不会涉及到运算,往前面补充0不也很正常的说嘛~

==== 9.1 更新 ====
书里面继续讲到了 关于逻辑位移。
的确,他是相对于算数位移的,将二进制数表示的信息作为四则运算的数值来处理就是算数。
而像图形模式那样,将数值作为单纯的 0\1 来处理罗列的就是逻辑。

发布者

ShellV

高中狗、喜欢前端、运维、AcgBag 动漫社区创始站长