当前位置 : 主页 > 编程语言 > java >

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

来源:互联网 收集:自由互联 发布时间:2022-08-10
重要的事情说在前边 在计算机中,数值一直是使用补码进行存储的 取反(~)和反码是不一样的,取反是把数值转换成二进制之后每个位上取反,反码(正数和负数的反码规则不一样)


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

正/反/补码解释

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

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

    ~6在计算机中的计算

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

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

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

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

  • 网友评论