0
点赞
收藏
分享

微信扫一扫

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


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

正/反/补码解释

  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


举报

相关推荐

0 条评论