今天打了一些代码,如下:
#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