为什么Java中Integer.MIN_VALUE等于负Integer.MIN_VALUE

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。为什么Java中Integer.MIN_VALUE等于负Integer.MIN_VALUE,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

Integer.MIN_VALUE == -Integer.MIN_VALUE

public static void main(String[] args) {
    int i = Integer.MIN_VALUE;
    System.out.println(Integer.toBinaryString(i));      // 10000000000000000000000000000000
    System.out.println(Integer.toBinaryString(-i));     // 10000000000000000000000000000000
    while (i != 0 && i == -i) {
        // 死循环,因为 i == -i 成立
    }
    // 注:
    System.out.println(Integer.toBinaryString(Integer.MAX_VALUE));    // 01111111111111111111111111111111
    System.out.println(Integer.toBinaryString(Integer.MAX_VALUE + 1));// 10000000000000000000000000000000
}
为什么Integer.MIN_VALUE == -Integer.MIN_VALUE?

int的表示范围:-2147483648~2147483647

  1. 当-2147483648转为正数时:Math.abs(-2147483648) == 2147483648。
  2. 当2147483648赋值给int时,int正数只能表示2147483647,也就是说:abs Integer.MIN_VALUE = Integer.MAX_VALUE + 1。
  3. 综上,int表示2147483648会溢出,变成01111111111111111111111111111111(2147483647)+ 1 = 10000000000000000000000000000000(-2147483648),也就刚好是Integer.MIN_VALUE。

还会产生其它问题

System.out.println(Math.abs(Integer.MIN_VALUE));   // -2147483648

竟然返回了负数,也就是说 Math.abs 对Integer.MIN_VALUE无效,且abs不保证一定返回非负结果。

为什么abs不保证结果非负数?

看源码:
在这里插入图片描述
原来abs用到了减号转换,也就是上述所说的int最小负数转正数溢出问题。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/180275.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!