二进制负数的补码为什么是符号位不变,其他位取反加一?
今天看了《逻辑设计基础》才明白了为什么二进制负数的补码是符号位不变,其他位取反加一
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(原)了呀!
其实聪明的读者已经想到了,这样有可能会导致溢出,正数加正数可能会出现负数,负数加负数可能会出现结果为正数!这又是怎么一回事呢?详情请看下回分解!