java中输出~6=-7的原因

举报
知识浅谈 发表于 2022/06/28 22:37:35 2022/06/28
【摘要】 重要的事情说在前边 在计算机中,数值一直是使用补码进行存储的 取反(~)和反码是不一样的,取反是把数值转换成二进制之后每个位上取反,反码(正数和负数的反码规则不一样) 正/反/补码解释 正数的原码/反...

重要的事情说在前边
在计算机中,数值一直是使用补码进行存储的
取反(~)和反码是不一样的,取反是把数值转换成二进制之后每个位上取反,反码(正数和负数的反码规则不一样)

正/反/补码解释

  1. 正数的原码/反码/补码 相同
  2. 正数取反(因为在计算机中数值的存储是按照数值的补码进行存储的,所以取反的时候先计算出数值的补码,然后取反)
  3. 负数的原码:是该数值的正值的符号位变成1
  4. 负数的反码:是其原码(除符号位)按位取反
  5. 负数的补码转换为原码:和原码变补码一样,除符号位外取反+1
  6. 负数补码:负数的反码+1

正/负数取反方法

  • 正数取反方法:
    • 取补码:和正数的原码相同
    • 按位取反:之后肯定是个负数
    • 把对应的补码转换成原码就是输出的数(此过程和原码取反码一样)
  • 负数的取反方法
    • 取补码:先把负数取反,然后+1就得到补码
    • 按位取反:因为去反后为整数
    • 把对应的补码转换成原码:因为正数的原码=补码,所以不变

~6在计算机中的计算

首先,6的原码、反码、补码相同,即都为0000 0110

  1. 计算机拿到6的补码,即0000 0110
  2. 对6的补码进行“~”计算(按位取反),得到1111 1001
  3. 结果已经得到了,只不过是一个补码形式,所以接下来要把补码转换成原码(因为这个结果很明显是个负数,所以按照负数的补码转换成原码的公式来),由上述公式得到原码为:1000 0111
  4. 已经得到结果的二进制,将二进制转换成十进制,得到-7

~(-6)在计算机中的计算

首先,-6的原码:1000 0110; 反码: 1111 1001; 补码:1111 1010

  1. 计算机拿到-6的补码,即1111 1010
  2. 对补码进行按位取反,得到0000 0101
  3. 将上述补码形式转换为原码,依旧是0000 0101
  4. 转换成十进制,得到最终结果5

文章来源: englishcode.blog.csdn.net,作者:知识浅谈,版权归原作者所有,如需转载,请联系作者。

原文链接:englishcode.blog.csdn.net/article/details/107624501

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。