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 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框
  • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
  • ¥20 学生成绩管理系统设计
  • ¥15 来一个cc穿盾脚本开发者
  • ¥15 CST2023安装报错
  • ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办
  • ¥15 有人懂怎么做大模型的客服系统吗?卡住了卡住了
  • ¥20 firefly-rk3399上启动卡住了
  • ¥15 如何删除这个虚拟音频