补码求原码和原码求补码,都是符号位不变,其余位按位取反后加一。
正数:
原码=反码=补码,符号位为0
负数:
计算机存储负数时,以补码形式存储。
原码:“-”号为1,其余转二进制
反码:“-”号为1,其余二进制按位取反
补码:“-”号为1,反码二进制基础上加一,逢二进一
按位取反
编程语言的“~”取反符号,符号位也会取反。
~x == -(x+1)
int main()
{
int a = -1; // 0xffffffff反码表示
// 以下两种操作,相当于取绝对值
int b = ~(a - 1); // b = 1
int bb = ~a + 1; // bb = 1
return 1;
}
注意
根据二进制编码求int整数表示时,级数和即可求得,不用管符号位
根据负数补码求int整数表示
string = "11111111111111111111111111111111"; // -1的补码表示
int tmp = 0;
for (int i = 0; i < string .size(); i++)
{
tmp = tmp * 2 + string [i] - '0';
}
return tmp; // tmp = -1;
cite from
https://zhuanlan.zhihu.com/p/99082236
https://blog.youkuaiyun.com/qk233/article/details/108715207