基础知识点:
1.计算机中数据都是以补码的形式存在的.
2.正数的补码是原码
负数的补码是将除符号位外其原码所有位按位取反,然后+1,符号位固定位1,表示是一个负数.
我们来简单的看一个demo.
unsigned short i1 = 102;
unsigned short i2 = 108;
unsigned short i3 = i1 - i2;
cout << i2 - i1 << endl;
cout << i3 << endl;
得到的输出结果是:
6
65530
为什么i1 - i2 后是:65530.
因为在计算机中只有加法,没有减法.
i1 - i2 = i1 + (-i2).
i1 = 102 的二进制等于:
0000 / 0000 / 0110 / 0110
i2 = 108 的二进制等于:
0000 / 0000 / 0110 / 1100
-108等于源码除符号位外,其余全部取反+1,+1的原则是逢2进1.
1111 / 1111 / 1001 / 0011
0000 / 0000 / 0000 / 0001
得到的负数的最终结果是:
1111 / 1111 / 1001 / 0100
所以现在我们的i1 - i2 就变成了:
0000 / 0000 / 0110 / 0110
+1111 / 1111 / 1001 / 0100
得到的结果就是:
1111 / 1111 / 1111 / 1010
转化为十进制就是:
65530
和我们的结算结果刚好对应的上.