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条)

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?