java中对一个整数进行取反后关于输出值的分析

2017-03-07  本文已影响0人  LiChangBao

在分析之前必须先明确如下几点:

1.Java是用补码来存储负数的,也就是说我们对一个数进行取反输出,输出的其实是一个在内存中以补码形式所存在的数;

2.原码,反码,补码的转换规则:{

(1)正数的原码,反码,补码完全一样即符号位固定为0数值位相同;

(2)负数的符号位固定为1,由原码转变为补码时的规则如下:  {

    (1)原码符号位为1固定不变,整数的每一位二进制数位取反得到反码;

    (2)反码符号位为1不变,在反码数值位最低位加1,得到补码。

  }

}

注:对一个数取反,得到的可不是它的反码哦!


举例:

public class Test{

      public static void main(String[] args){

                int a = 8;

                System.out.println(~a);//测试发现输出-9,而不是大多数人认为的7

      }

}

分析:

正数8的二进制表示如下:

00000000 00000000 00000000 00001000   (正数8的原码,补码,反码都是这串二进制数)

对正数8进行取反得:

11111111 11111111 11111111 11110111(*)

可以发现对正数8进行取反后由于符号位变成了1故得到了一个负数然而java存储负数时是用其补码来进行存储的即问题转化为求由于对正数8取反所得的负数存储问题!按照负数原码和补码转化规则:

1.(*)的符号位1不变,其它位取反得到反码:

     10000000 00000000 00000000 00001000

2.反码的符号位不变,反码的数值位最低位加1,得到补码:

     10000000 00000000 00000000 00001001(该串二进制数即为输出的-9)

以上就是为什么对正数8取反操作后输出的值为-9的原因。

上一篇 下一篇

猜你喜欢

热点阅读