无符号类型的数据类型做减法

基础知识点:
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

和我们的结算结果刚好对应的上.

猜你喜欢

转载自blog.csdn.net/zhangkai19890929/article/details/85071253
今日推荐