正数的补码等于自身。负数的补码等于其绝对值取反加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;