你真的知道计算机是如何进行减法运算的吗?

时间:2024-02-01 10:38:32

在这里插入图片描述
问:现在的时间是3点钟,如何转动时针,让时间到达2点钟呢?
答:减去1小时,亦或是加上11小时。

在这里插入图片描述

问:图中一个字节的无符号数值,它代表十进制数据 2, 如何让它变成1呢?
答:减去1,亦或是加上255。

因为时钟旋转一周为360°,所以顺时针旋转330°,也就等于逆时针旋转30°(360° - 330°);
因为一个字节的无符号数值最多表现为256种数值状态,所以减1,也就等于加255(256 - 1)。

也就是说:

   2 - 1

= 2 + (256 - 1)

= 2 + 255

= 257

= 257 - 256(减去溢出位)

= 1

   0000 0010 - 0000 0001

= 0000 0010 + 1111 1111

= 1 0000 0001

= 0000 0001

反过来说,顺时针旋转-30°(逆时针旋转30°),也就等于顺时针旋转330°;
加上-1(减去1),也就等于加255。

因为无符号数值无法表示负数,这里再加入有符号数值的概念。
在这里插入图片描述
这是一个字节的有符号数值,它代表十进制2。

有符号数值与无符号数值的区别在于:
无符号数值中只有数据位;
有符号数值中除了数据位,还包含符号位。
当符号位为0时,代表整个数值为正数;
当符号位为1时,代表整个数值为负数。

此时的数据位只有第0位到第6位,一个字节的有符号数值的数据位最多表现为128种数值状态,再算上符号位有两种状态,所以总的来说还是有256种数值状态。

   2 - 1

= 2 + (256 - 1)

= 2 + 255

又因为减去一个数等于加上这个数的负数,所以:

   2 - 1

= 2 + (-1)

从而可以得到:
在一个字节的数值中,加上-1和加上255(虽然现在的取值范围不包括255)是一样的,所以-1的有符号二进制形式为1111 1111。

a、b皆为正整数,且a、b现有n种数值状态:

a - b = a + (-b)

a - b = a + (n - b)

由此可得:

a + (-b) = a + (n - b)

-b = n - b

停住,求到这一步已经可以了,再求下去就是n=0了

接下来代入本篇文章最开始的问题,因为钟表是12小时为一圈的,所以n为12,3点调到2点,a为3,b为1

-1 = 12 - 1

-1 = 11

a - 1 和a + 11都等于2

要理解这个点,一定不能把数值看作一条直线,而应该看成一个圆圈。

钟表以12小时为一圈,它的取值范围是在1 ~ 12之间,所以减去1就是加上11;

一个字节的无符号数拥有256个数值,它的取值范围是在0 ~ 255之间,所以减去1就是加上255。

比如:
8位的数值共有256个状态
16位的数值共有65536个状态
32位的数值共有4294967296个状态

如何求出-1在8位的数值中的二进制形式?

   256 + (-1)

= 255

= 1111 1111

如何求出-1在16位的数值中的二进制形式?

   65536 + (-1)

= 65535

= 1111 1111 1111 1111

如何求出-1在32位的数值中的二进制形式?

   4294967296 + (-1)

= 4294967295

= 1111 1111 1111 1111 1111 1111 1111 1111

如何求出-2在8位的数值中的二进制形式?

   256 + (-2)

= 254

= 1111 1110

如何求出-8在8位的数值中的二进制形式?

   256 + (-8)

= 248

= 1111 1000

可能看到这里,有的人已经发现了,笔者的思路是将通过原码求反码,再通过反码求补码的步骤合成一步了

在这里插入图片描述
正数的原码、反码、补码一致
负数的原码的符号位为1,数据位与其绝对值的数据位一致
将负数的原码的符号位不变,数据位取反即可得到负数的反码
最后将负数的反码的符号位不变,数据位加1即可得到负数的补码

比如说-1

它的原码为

1000 0001

将其原码的符号位不变,数据位取反,得到反码

1111 1110

最后将其反码的符号位不变,数据位加1,得到补码

1111 1111

其中得到反码的步骤中的数据位取反,可以看做用111 1111减去数据位

   111 1111
 - 000 0001

也就是127 - 1

然后得到补码的步骤中的数据位加1,可以看做加上000 0001

   111 1111
 - 000 0001

 +000 0001

也就是

   1000 0000
 - 0000 0001

也就是128 - 1

最后得到反码和得到补码的步骤中都包含的符号位不变,也就是需要加上符号位, 可以看做加上1000 0000

   1000 0000
 - 0000 0001

 + 1000 0000

也就是

   1 0000 0000
 - 0 0000 0001

也就是256 - 1

所以-1的二进制形式与一个字节无符号形式下255的二进制数值一致

笔者才疏学浅,慌忙之下难免有遗漏或是疏忽,如有错误之处,还望各位看官不吝赐教,笔者在此感谢。

作者:Fatman

博客园地址: herf="https://www.cnblogs.com/liujingjiu">https://www.cnblogs.com/liujingjiu

CSDN地址: herf="https://blog.csdn.net/qq_35508835">https://blog.csdn.net/qq_35508835

版权归 herf="https://www.cnblogs.com/liujingjiu">Fatman所有,欢迎保留原文链接进行转载:)