你真的知道计算机是如何进行减法运算的吗?
问:现在的时间是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所有,欢迎保留原文链接进行转载:)