意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

便于计算机处理的补数详解

来源:恒创科技 编辑:恒创科技编辑部
2024-01-31 01:47:59


负数的方法

二进制数中表示负数值时,一般会把最高位作为符号来使用,因此我们把这个最高位当作符号位。符号位是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错误分析图:

便于计算机处理的补数详解_计算机基础_02

1000 0001

然后用补数 1111 1111,来论证一下正确性

1 - 1 错误分析图:

便于计算机处理的补数详解_补码_03

1111 111,然后与1进行加法运算,得到的结果是九位的1 0000 0000,结果发生了溢出,计算机会直接忽略掉溢出位,也就是直接抛掉 最高位1,变成 0000 0000,也就是0,结果正确,所以1111 1111表示的就是-1

所以负数的二进制表示就是先求其补数,补数的求解过程就是对原始数值的二级制各位取反,然后将其结果 +1

当然,结果不为0的运算通过也可以通过补数求得正确结果

不过,有一需要注意,当运算结果为负的时候,计算结果的值也是以补数的形式出现的,比如3 -5这个运算,来看一下解析过程:

3 - 5 的解析过程:

便于计算机处理的补数详解_java_04

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虽然既不是正数也不是负数,但是考虑到其符号位,就将其归为正数

上一篇: #yyds干货盘点#面试必刷TOP101:最长的括号子串 下一篇: 手机怎么远程登录云服务器?