二进制负数的补码为什么是符号位不变,其他位取反加一?

今天看了《逻辑设计基础》才明白了为什么二进制负数的补码是符号位不变,其他位取反加一

1. 什么是补码?

补码:计算机是用来将减法转换成加法的一种手段,在计算机系统中,数值一律用补码来表示和存储。

2. 如何求补码?

  • 如何求解一个补码,就要先涉及到的概念,那么什么是呢?

“模”是指一个计量系统的计数范围。比如说:对于 1 位十进制数字,它的范围是:0-9,那么它的模就是 10

模可以理解为当前空间所能表示的最大的数字再加一,再比如对于 3 位二进制数,它能表示的最大数字为 111,

那么它的模就是 1000,比它能表示的最大数字加一。

  • 那么对于补码又有什么作用呢?

首先强调一下,正数的补码=正数本身,负数的补码需要进行计算

  • 那么负数补码又和有什么关系呢?

负数的补码 = (-)【模 - (负数的绝对值) 】

这里的绝对值就是相当于忽略掉原来的数字符号,将负数当成它的相反数正数来计算,再将符号位填到结果前面

比如说:对于一个为 10 的 -2(原),它的补码就为 (-) 8 (补)

对于二进制数字来说,第一个位用来表示符号,0 表示正数,1 表示负数

那么对于带符号位的四位二进制来说:

0111(原) 的补码=0111(补)(因为 0 表示正数,正数的补码是它本身)

1001(原) 的补码=1111(补)(因为 1 表示负数,负数的补码=(-)【模-(负数的绝对值)】= (-)【1000-011】)

3. 那么跟你的标题有毛线的关系?

别着急,咱们慢慢来,标题上说的是:负数的二进制补码=符号位不变其它位取反加一

咱们先来看一个例子(就是上面的例子):对于四位二进制来说,第一个位表示符号,0表示正数,1表示负数

0111(原) 的补码 = 0111(补)

1001(原) 的补码 = 1111(补),我们尝试一下,全反加一的操作

1. 1 001(原)符号位不变,先取反得:1 110(反)

2. 再加一,1 110 + 1 = 1111(补)

4. 咦!真得上面的数欸,为什么取反加一就等于模减去负数的相反数呢,好神奇欸? 

嘿嘿,其实真滴是蛮神奇的,神奇就神奇在这是二进制!

先说个例子,对于三位二进制数:111 来说,它减去任何的三位二进制数都等于减去的三位二进制数的相反数!

真的这么神奇吗?

嘿嘿,我们来简单举个例子:111 - 101 = 010,010 是 101 的取反操作

111 - 010 = 101,101 是 010 的取反操作

哇哦,神奇吧,其实还行,1 - 1 = 0,1 - 0 = 1,这个就是里面的原理!

  • 你上面说的这个和 4.主题有什么关系呢?

这关系可大了!模是什么?模是能表示的最大数加一,那么对于任何N位二进制的数(不包含符号位),它的模是:2^N

那么它的最大值是多少呢?当然是 2^N - 1 啦,对于 3 位二进制数,它的模是 2^3 = 8,它的最大值是 2^3 - 1 = 7 也就是 111

  • 这下懂了吗?

计算 1 001 的补码就相当于先用 模-1 得到最大值 111,再用 111 - 001 = 110,再加上 1,就相当于用 模(1000) - 001 啦!

最后得到的 110,再补上符号位1,得 1110

5. 最后算两道题目

1111 + 0110 = ?

1011 + 1001 = ?

6. 突然又不明白负数的补码化成原码也是取反再加一了?

这其实和原码化成补码是一个道理!

咱们举个例子就懂了,对于模为10的一位十进制数字(不包含符号位),- 4(原),它的补码为 - 6(补)

补码如何计算的?负号先放一边,10 - 4 = 6,再加上负号得 -6(补)

那么从 -6(补)变回原码如何办?那也是相同的操作呀!将负号放一边,10 - 6 = 4,再加上负号得 -4

这样不就得到了 -6(补)的原码 -4(原)了呀!

其实聪明的读者已经想到了,这样有可能会导致溢出,正数加正数可能会出现负数,负数加负数可能会出现结果为正数!这又是怎么一回事呢?详情请看下回分解!