关于位运算符~的疑问...

我是一个即将步入大学的计科学生,目前在自学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的运算过程又是怎样的呢?
是不是图中的教程出错了或者不完善呢?

问题如此冗长十分抱歉!望大佬解答

3个回答

用二进制而不是int类型表示的值去理解
11011000对应int类型的值-39
~a+a=11111111,在int类型下对应-1

zaq15csdn
greatofdream 回复Leonardo||Watch: 负数保存的都是补码
3 个月之前 回复
weixin_45472156
Leonardo||Watch 抱歉,是char a=-39
3 个月之前 回复
weixin_45472156
Leonardo||Watch 我可不可以这样理解:声明的变量会被取反之后存入变量地址,所以写char -39,计算机保存的是它的反码
3 个月之前 回复

把a用Binary去理解及很好了

如:
十进制60,转换二进制为:0011 1100

按位取反运算符(~)的作用是,将二进制位取反操作,也就是0变1,1变0
所以得出十进制60的取反结果为:1100 0011

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!