c语言按位取反 补码,按位取反运算符,数值取反之后是反码,还是补码- -

最佳答案

你的概念不正确,按位运算,只对内码进行操作,不管类型,而反码/补码是针对有符号整型的(符号位不变)

对负数按位取反,得到的是正数,它的符号位也会取反的

追问:

哦,内码是不是补码呢?-19的二进制 1 0010011 反码 1 1101100 补码 1 1101101 按位取反 0 0010010 9的二进制 0 0001001(原反补) 按位取反 1 1110110(教程上说是补码,还要计算出反原码,而上面负数计算出补码,取反就是值,为什么正数还要取反之后在计算)

追问:

就是按位取反之后的值,还要计算出反原码呢

追答:

个人觉得你的教程有点误导(当然,因为计算机是一门新型技术,没有绝对的权威和标准),我说的按位取反是从应用角度.它与补码/原码没有关系(C语言的~运算符)而在理论角度,正数的原码、反码与补码都是相同的只有负数才会去计算反码和补码一般的说法,反码中的按位取反,符号位是不变的(且现在除单片机,没有8位的了)

追答:

目前大家认可的说法,正数的原码、反码与补码是相同的,它不会计算原码、反码与补码你上面的9的二进制的原码、反码与补码都是 00001001

追问:

哦,那你能帮我用你的方法,计算出-19和9。按位取反之后的值吗?就像上面我那样。

追答:

若是实际的按位取反(8位的)Not(-19D) = ‭18D= 00010010BNot(9D) = -10D =‭11110110‬B这个无论是用微软的计算器,还是下列程序,都是相同的结果#includeint main(){ char x=-19,y=9; x=~x; y=~y; printf("%d %d\n",x,y); return 0;}

追问:

那个过程能不能写一下啊

追答:

过程与你的一样-19在计算机内部是用补码存储的,8位的二进制为‭11101101‬按位取反后值为00010010也就是十进制的18而9的话,二进制为00001001按位取反后值为11110110若是有符号的十进制就是-10当然,若是无符号的就是246另外,符号只是人为的规定,二进制的值才是真正内部值

最佳答案由网友  whoami1978  提供

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值