我是一个即将步入大学的计科学生,目前在自学c语言,看到菜鸟教程运算符里
关于位运算符~的讲解产生了疑惑。
图中的A=60
#include<stdio.h>
int main()
{
char a=60,c=~a;
printf("c的值:%d\n",c);
return 0;
}
输出内容为
c的值:-61
这里用char的原因是char只有1byte,方便接下来我的实验
开始看到这里我还不知道补码是什么,然后花了几个小时理解了原码,反码,补码的意义及作用。
然后我知道了输出的结果是将60的二进制数00111100按位取反得到的补码,
于是我便想新设置一个c值,然后反推出a值来验证我对这个运算符的理解,但这却让我产生了疑惑。
我设置的c值是38,为了能输出38,必须要让~a的结果是38的二进制补码。
38的二进制原码为:00100110,补码为00100111
为了让a的八位二进制值按位取反得到00100111,
a的八位二进制值应该是11011000,所以a的十进制数应该是-90。
可实验结果并不如我所想,反复测试我知道了:
如果a为负值,则~a=-(a-1),
如果a为正值,则~a=-(a+1)。
而图片中表述的~运算原理只有在a为一个正值的时候才成立,
这是因为输入正值按位取反后得到的补码一定是符号位为1的负值,转为反码再转为原码就是符号位为一,绝对值增加1的二进制数;而输入负值按位取反后得到的补码则是一个符号位为0的正数,正数的原码和反码相同,所以得到的值出现了误差
那么输入负值的a后~a的运算过程又是怎样的呢?
是不是图中的教程出错了或者不完善呢?
问题如此冗长十分抱歉!望大佬解答