二补数了解一下XD
方才看刘汝佳的粉书的时候,提到了补码表示法,然后我就想起来了之前一个没想通的问题,那就是 -128在电脑中怎么表示?。
以8bit机器为例,我们知道,在计算机中是没有符号的,因此产生了用数字来表示符号位的做法,即正0负1,这种方法极大的方便了我们去看和理解,但是却苦了计算机。
为什么这么说呢,我举个栗子: + 1 + (- 1) = ? , 明眼人一看就知道答案是0,可是对于计算机来说,是这样吗? 用正0负1的表示法:0000 0001 + 1000 0001 = 1000 0010 = -2。诶~答案不对(没想到吧!.jpg)。为了弥补这种缺陷,于是便出现了反码(正数的反码=原码,负数的反码在原码的基础上,符号位不变,其余按位取反)。那么用反码再来计算一下 0000 0001 + 1111 1110 = 1111 1111,刚好,在反码表示法中1111 1111表示的是(-)0。这样计算结果就对了。
你以为这么简单就结束了?naive,看上面的式子,有没有发现0前面还有个负号,0怎么可能还分正负呢。我们初一数学第一课教的就是正数,负数,0。于是,为了应对这种情况,人们又想出来一种表示方法 --- 补码。
这里先歪一下题(可先跳过):我们都知道补码是在反码的基础上+1(针对负数),那么有没有想过它是怎么来的?一味的记结论可不行,我这里依旧举个栗子,帮助各位理解一下(其实是捋一捋自己的思路),-8怎么表示(仅限8bit)? 按照正常的方法,肯定直接是(1000 1000),那么我们换一种思路,用 0 - 8。0000 0000 - 0000 1000。发现不够减,怎么办?小学没学过借位啊。借一位就是了,你可能会问,哪来的位给你借?诶~此言差矣,我们就先假设有位给你借(实际上这就是补码的由来),那么有位了就可以计算了:
1 0000 0000 - 0000 1000 = 1111 1111 + 1 - 0000 1000 = 1111 0111 + 1 = 1111 1000 ,实际上,这个答案也就是-8的补码表示了。
回到补码来说,它的存在,使得正负0合并成了一个0。举个栗子(栗子:我累~别举了),还是上面的+1 + (-1) = 1111 1111 = (-) 0,现在有了补码,我们在答案的基础上+1 , 结果是什么呢 ?1111 1111 + 1 = 1 0000 0000,有9bit,这个计算机只是个8bit机器,因此最高位丢掉(溢出了),剩下的就是0000 0000,也就是0,这下没有正负了,也正常了。但是,有得有失嘛,根据宇宙中一切守恒的定律,我们在8bit机器上多出了个-128,这个数字在计算机中的补码表示正是1000 0000。
这样,就明白了为什么8bit表示的范围是从 -128 ~ +127, 而不是 - 127 ~ + 127。
我应该去看看深入理解计算机系统的。emmm。
以上。