对于unsigned int,其数据范围为[0,2^32 - 1]。
补码和原码都是对于有符号数而言的。
对于int,
[0,2^31 - 1]为正数,
[-2^31,-1]为负数。
对于负数-x来说,补码表示实际上为2^n - x,其中n为该数的位数,则-x与x相加刚好为0。
那么我们注意到,对于x∈[0,2^31 - 1],32位表示,则最大的数2^31 - 1,其最高位为0(小于该数的也是如此),其余位为1,故最高位为0,则判断为正数。
对于[-231,-1],32位表示,则最大的数-1,补码表示为232 - 1,最高位为1(小于该数的也是如此),故最高位为1,判断为负数。
(补码计算公式:正数补码=原码,负数补码=原码取反+1)
eg:
unsigned a = -1; //0xffffffff
cout<<hex<<a<<endl; //输出0xffffffff
int b = -1; //0xffffffff
cout<<b<<endl; //输出-1
参考:https://www.cnblogs.com/liu-runda/p/9789522.html