在C语言里面正数的源码、反码和补码都是一样的,但是负数不一样,而C语言在存储时往往是以补码的形式存储。举个例子:
#include <stdio.h>
int main()
{
int a = 0;
printf("%d", ~a);//对a进行按位取反
//a是用int类型存储,有4个字节,也就是8个比特位,结果出来是-1
return 0;
}
对a进行按位取反之后为什么结果是-1,通过一个表格来看看-1的源码、反码以及补码。
10000000000000000000000000000001 | -1的源码,最前面的1是符号位 |
1111111111111111111111111111111111110 | 进行~a之后的反码,符号位不用取反,这时候得到的就是反码 |
1111111111111111111111111111111111111 | 在反码的基础上+1,得到的就是补码,为全1,正好是0按位取反之后得到的数 |
所以得到的~a是-1。