c++ 中位运算问题

来源:百度知道 编辑:UC知道 时间:2024/07/04 02:18:40
int i=2;
i=~i;
printf("%d\n",i);
结果i怎么是-3?i=2,应该是二进制的10啊,反过来就是01,结果应该是1才对阿,怎么是-3呢?球高手解释一下。还有整形占4个字节就是32个位,那么我的这个i每个位上都是什么啊?能不能说一下,然后是怎么反过来的?谢谢

i=2即
00000000 00000000 00000000 00000010
取反就是
11111111 11111111 11111111 11111101
因为在计算机里整数是按补码的方式存放的,因此
11111111 11111111 11111111 11111101
的原码就是(求法就是把补码值减1,再取反,最高位即符号位不变)
10000000 00000000 00000000 00000011
十进制也就是-3

i=2即
00000000 00000000 00000000 00000010
取反就是
11111111 11111111 11111111 11111101,那么这个数是多少呢?这得取决你把它看成是什么,如果声明为unsigned int,那么他是一个非常大的数。因为你声明的是int,因此这是一个负数 (最高位为1),这个负数的值为取反加一(补码),即
00000000 00000000 00000000 00000011,这下容易看出它是3,别忘了它是负的,所以是-3.