补码

正数的补码等于自身。负数的补码等于其绝对值取反加1(符号位不参与此运算)。

例如计算-1的补码:先把1按位取反得(0)1111…110, 加上1得(0)1111…111,所以-1的补码就是(1)1111…111。

使用补码的好处是符号位可直接参与运算,不用单独考虑,同时,减法能看作加法处理。

例如:

2-1 = 2+(-1) 转换为二进制表示就是: 10 + 1111…111 = 1; (最高位的进位被舍弃,故符号位为0)

2-3 = 2+(-3) 转换为二进制表示就是: 10 + 1111…101 = 1111…111; (即-1)

引申一下,所以根据这个道理,想取无符号整数的最大值很简单,只需对0取反:

unsigned int max = (~0);

但有符号整数就需要:

int max = ~(1<<31);

而取有符号整数的最小值则是:

int min =  (1<<31)+1;

原文地址:https://www.cnblogs.com/k330/p/2232357.html