Leonardo||Watch 2019-08-12 02:22 采纳率: 100%
浏览 439
已采纳

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

我是一个即将步入大学的计科学生,目前在自学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条回答 默认 最新

  • greatofdream 2019-08-12 10:13
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题