计算机内部储存中,负数以其补码的形式存在,原因是在模意义下加上一个负数等价于加上一个mod-该数等价于数取反加一(所有操作均是为了避开减法)。
因此在32位二进制储存中最高位32位为符号位1000 0000 0000 0000 0000 0000 0000 0000 表示最大的负数,0111 1111 1111 1111 1111 1111 1111 1111(2^31)表示为最大的整数。
并且一个数>>31为可以得到它的符号位;
例(绝对值函数)
int abs(int t)
{
return (n^(n>>31))-n>>31;
}
//“-”号等价于加上该数取其反码加一表示的数,故若n为负数n>>31的二进制表示为1111 1111 ......1111,-号运算后为0000.......0001等价于加1//
//n^(n>>31)由上可知n右移31位后其二进制表示为1111 1111 .....1111,“1”与原数异或其实等价于求其反码//
//因此当n为负数时该式子其实就是在逆向求其对应正数的原码,与求补码方式相同,即先求其反码再加一(其实就是“-”号运算)//
//若为n为正数分析思路一样
//核心即是理解负数的储存形式为其补码
参考链接:
https://blog.csdn.net/u014082714/article/details/43193173
https://oi-wiki.org/math/bit/