为啥0的反码为-1呀?

时间:2022-10-19 12:07:51

今天打了一些代码,如下:

#include<stdio.h>

int main()

{

int a=0;

int b=~a; //按位取反

printf("%d\n",b);   //使用的,打印的是原码

return  0:

}

结果;-1

原因:

int占4个字节,32个bit位

0000 0000 0000 0000 0000 0000 0000 0000 取反为

1111 1111 1111 1111 1111 1111 1111 1111   (其中第一位为最高位,0为正数,1为负数)

但是负数在存储的时候为二进制的补码,,所以1111 1111 1111 1111 1111 1111 1111 1111为补码,怎么变为原码呢?

1.正数的原码、反码、补码相同。

2.负数的反码:最高位不变,后面的取反,补码为反码数值加1。

所以1111 1111 1111 1111 1111 1111 1111 1111的反码为

      1111 1111 1111 1111 1111 1111 1111 1110(补码)

      1000 0000 0000 0000 0000 0000 0000 0001(原码)

所以结果为-1