在计算机系统里,整数以补码形式储存。
原码:数值的二进制
例:int 10 0000 0000 0000 1010
int -10 1000 0000 0000 1010
反码:正数的反码就是其原码,负数的反码则是原码符号位不变,其他值取反
例:
int 10: 0000 0000 0000 1010
int -10:1111 1111 1111 0101
补码:正数的补码就是原码,负数的补码是反码+1
例:
int 10:0000 0000 0000 1010
int-10:1111 1111 1111 0110
int main()
{
int a=10;
printf("%d",~a);
}
要求出这段代码的输出结果,首先我们应该明白,整数在计算机系统里以补码形式储存,因此,取反符号实际上是对整数10补码的取反,并得到了另一个补码。
我们先算出10的补码:
10:0000 0000 0000 1010
对其取反得到:
~10: 1111 1111 1111 0101
现在这是一个负数的补码,这就是"~a"得到的结果,要算出其输出的值我们可以将这段补码转换成原码再将原码转换为十进制:
当前补码:1111 1111 1111 0101
负数的反码等于补码减1
减1得到反码:1111 1111 1111 0100
对非符号位取反得到原码
原码:1000 0000 0000 1011
原码换算成十进制为-11
如图:
具体为什么有原码、反码、补码存在请参考以下文章: