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

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

作者: LiChangBao | 来源:发表于2017-03-07 19:03 被阅读0次

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

    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的原因。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/xxtvgttx.html