今天在学习C语言的位运算,位运算是要将数字转换成二进制,对操作数的每一位进行相应计算; 开篇 我定义了一个无符号整数60,对其进行按位取反的操作,程序输出为-61 // a = 0011 1100unsign
今天在学习C语言的位运算,位运算是要将数字转换成二进制,对操作数的每一位进行相应计算;
开篇
我定义了一个无符号整数60,对其进行按位取反的操作,程序输出为-61
// a = 0011 1100
unsigned int a = 60;
int c = 0;
c = ~a;
// 1100 0011
printf("逻辑非位计算:%d\n", c);
疑惑
当我看到-61的时候,就有点疑惑了,因为60的二进制是0011 1100
,按位取反后为1100 0011
,首位表示符号位,那么100 0011
转换为二进制是67,答案应该是-67啊
恍然大悟
我仔细观察代码后发现,变量 a
的类型是 unsigned int
,而变量 c
的类型是 int
。
在这种情况下,对于无符号整数 a
进行按位取反操作时,结果会被解释为有符号整数。
由于 int
类型使用补码表示负数,因此按位取反后的结果是补码,我们需要根据补码求出来原码,才是最终的结果;也就是对补码 1100 0011
进行转换得到原码1011 1101
,被解释为有符号整数 -61。
因此,变量 c
的值确实是 -61。