右移空出来的高位数值,有0和1两种形式。要想区分什么时候补0什么时候补1,首先就行需要掌握二进制数表示负数的方法
二进制数中表示负数值时,一般会把最高位作为符号来使用,因此我们把这个最高位当作符号位。符号位是0表示正数,是1表示负数。那么-1用二进制数如何表示呢?可能很多人会这么认为:因为1的二进制数是 0000 0001,最高位是符号位,所以正确的表示-1应该是1000 0001,但是这个答案真的对吗?
计算机世界中时没有减法的,计算机在做减法的时候,其实就是在做加法,也就是用加法来实现的减法运算。比如100 - 50,其实计算机来看的时候应该是 100 + (-50),为此,在表示负数的时候就要用到二进制补数,补数就是用正数来表示的负数
为了获得 补数,我们需要将二进制的各位数的数据全部取反,然后再将结果 +1即可,先记住这个结论,下图为演示:
-1 取反过程:
具体来说,就是先获取某个数值的二进制数,然后对二进制数的每一位做取反操作(0 ---> 1 ,1 ---> 0),最后再对取反后的数+1,这样就完成了补数的获取
补数的获取,虽然直观上不易理解,但是逻辑上却非常严谨,比如我们来看一下 1 -1的这个过程,我们先用上面的这个 1000 0001 (它是1的补数,用来做计算)来表示一下
1 - 1错误分析图:
1 - 1会变成130,而不是0,所以可以得出结论,1000 0001 表示-1是完全错误的
然后用补数 1111 1111,来论证一下正确性
1 - 1 错误分析图:
我们可以看出 1 - 1实际上就是1 + (-1),对-1进行上面的取反 +1后变为1111 111,然后与1进行加法运算,得到的结果是九位的1 0000 0000,结果发生了溢出,计算机会直接忽略掉溢出位,也就是直接抛掉 最高位1,变成 0000 0000,也就是0,结果正确,所以1111 1111表示的就是-1
所以负数的二进制表示就是先求其补数,补数的求解过程就是对原始数值的二级制各位取反,然后将其结果 +1
当然,结果不为0的运算通过也可以通过补数求得正确结果
不过,有一需要注意,当运算结果为负的时候,计算结果的值也是以补数的形式出现的,比如3 -5这个运算,来看一下解析过程:
3 - 5 的解析过程:
3 - 5的运算,我们按着上面的思路过一遍,计算出来的结果是1111 1110,我们知道,这个数值肯定表示负数,但是负数无法直接用十进制表示,需要对其取反+1,算出来的结果就是2,因为1111 1110的高位是1,所以最终的结果是-2
编程语言的数据类型中,有的可以处理负数,有的不可以,比如C语言中不能处理负数的unsigned short类型,也有能处理负数的short类型,都是两个字节的变量,它们都有2的十六次幂数值,但是取值范围不一样,short类的取值范围是-32768 ~ 32767,unsigned short的取值范围是0 - 65536
仔细思考一下补数的机制,就能明白-32768比32767多一个数的原因,最高位是0的整数有0-32767共32768个,其中包括0。最高位是1的负数,有-1 - -32768共32768个,其中不包含0。0虽然既不是正数也不是负数,但是考虑到其符号位,就将其归为正数