有时我们可能会遇到一些数据结构的大小的判定,比如判断两个堆(假设为heap1,heap2)中元素个数差值是否大于1
heap1.size() - heap2.size() > 1
heap1.size() > heap2.size() + 1
看似等价的两个比较的不等式,产生的效果未必相同
由于数据结构的大小采用的往往是无符号整型数,如果heap1.size() - heap2.size()的结果为负数,比如\(-1\),在无符号数中实际为\(4294967295\),二进制表示为\(11111111111111111111111111111111\),可以看出无符号数会将有符号数补码的符号位当作正常的数位,所以对应的数值就会很大,显然与我们的判断目的相违背
并且还需要注意,无符号数与有符号数比较时,要将有符号数转化为无符号数
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int c = -2;
c >> 1;
cout << c << endl;
c >>= 1;
cout << c << endl;
c >>= 1;
cout << c << endl;
return 0;
}
结果
从c++的代码执行效果来看,负数移位是在补码的基础上进行的,移动之后,填充符号位,正数填0,负数填1
-1的补码为\(11111111111111111111111111111111\),右移一位补码仍为\(11111111111111111111111111111111\),表示的仍然为-1
加减法的优先级是高于移位运算符的
原文:https://www.cnblogs.com/G-H-Y/p/14493750.html