(给ImportNew加星标,提高Java技能)

编译:ImportNew/覃佑桦

programming.guide/java/minus-min-value.html

出人意料的是,下面两个表达式的计算结果居然为 true:

-Integer.MIN_VALUE == Integer.MIN_VALUE   // true-Long.MIN_VALUE    == Long.MIN_VALUE      // true而 Byte 和 Short 的结果看起来和预期的一样:-Byte.MIN_VALUE  == Byte.MIN_VALUE    // false-Short.MIN_VALUE == Short.MIN_VALUE   // false

这背后究竟发生了什么?

分析

Java 用两个补码表示整数。用这种表示方法,value 在起点不对称。负数的个数比正数少。最小负数没有对应的正数!例如:

  • Integer.MIN_VALUE 等于 −231

  • Integer.MAX_VALUE 等于 +231−1

尝试对 −231 取反时,会得到 231 超出最大整数,因此会发生溢出变为负数。

示例:

换句话说,Integer.MIN_VALUE等于对自己取反。这也会引起其它意外情况,例如 Math.abs(Integer.MIN_VALUE),的实现为x < 0 ? -x:x,会回负值。

那么 byte 和 short 会怎么样?

byte 和 short 也是用两个补码存储。但是,Java 不会直接对 byte 和 short 进行算术运算。相反,它们会先被提升为 ints,然后进行取反。

假设 b 是 byte,那么 -b 等价于 –((int) b)。

通过两个重载方法可以很好地进行说明。

void m(byte b) { System.out.println(“A byte”); }void m(int i)  { System.out.println(“An int”); }

按照下面进行调用:

byte b = 0;m(b);       // Prints “A byte”m(-b);      // Prints “An int”

因此,-Byte.MIN_VALUE 等于128,但类型为 int。如果把结果转回 byte(最大值为127),将翻转并变为−128,与 int 和 long 的情况一样:

(byte) -Byte.MIN_VALUE    == Byte.MIN_VALUE    // true(short) -Short.MIN_VALUE  == Short.MIN_VALUE   // true

示例:

推荐阅读  点击标题可跳转

Java 实现贪心算法实例介绍

Java 异步编程:内置功能与三方库

Java 并发:使用 AtomicReference 处理竞态条件

看完本文有收获?请转发分享给更多人

关注「ImportNew」,提升Java技能

好文章,我在看❤️

.net byte转java byte_Java 最小值之谜相关推荐

  1. .net byte转java byte_Java Web安全 || Java基础 Java Agent

    点击上方"凌天实验室","星标或置顶公众号" 漏洞.技术还是其他,我都想第一时间和你分享 " [历史]已连载更新全部内容:[菜单栏]-[JAVA SE ...

  2. 解析Java横死之谜,气定神闲看花开花落

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 原创:小姐姐味道(微信公众号ID:xjjdog),欢 ...

  3. java byte_Java byte数据类型详解

    public static String bytes2HexString(byte[] b) { String ret = ""; for (int i = 0; i < b ...

  4. java list 最小值_Java 实例 – 查找 List 中的最大最小值

    Java 实例 - 查找 List 中的最大最小值 以下实例演示了如何使用 Collections 类的 max() 和 min() 方法来获取List中最大最小值: /* author by w3c ...

  5. C的无符号数据类型int,short,byte 转为 Java对应的数据long,char,short

    //从网络中读取C的无符号int,short,byte字节数组,相应转换成java的long,char,short short anUnsignedByte = 0; char anUnsignedS ...

  6. .net byte转java byte_CVE20200688的武器化与.net反序列化漏洞那些事

    0x00 前言CVE-2020-0688是Exchange一个由于默认加密密钥造成的反序列化漏洞,该漏洞存在于Exchange Control Panel(ecp)中,不涉及Exchange的工作逻辑 ...

  7. java栈最小值的实现,关于java:算法图解如何找出栈中的最小值

    后面咱们学习了很多对于栈的常识,比方<动图演示:手撸堆栈的两种实现办法!>和<JDK 居然是这样实现栈的?>,那么接下来咱们再来刷一些对于栈的经典面试题以坚固学过的常识. 咱们 ...

  8. Java翻译byte数据,java学习|图说String(二):基于byte数组的String方法调用

    基于byte数组的String方法调用 上文说到,String的方法调用都是基于byte数组,其实说更详细点:都是基于String中value字段的调用: 注,本文中所有的源码均基于jdk11 通过上 ...

  9. Java最大值最小值问题(用户输入)

    前言:做编程题遇到的问题,对思路有较好启示 目录 输入的值较少 输入的值较多 方法一(循环) 方法二(Arrays.sort排序)(值较少时也可以用) 输入的值较少         当输入的值较少时, ...

最新文章

  1. python制作ios游戏_python自动化生成IOS的图标
  2. python redis用法详解
  3. NRF51 BOOTLOADER 编译注意事项
  4. require.js的用法
  5. Windows Presentation Foundation (WPF)中的命令(Commands)简述
  6. 计算机行业人员的鄙视链
  7. ARM的流水线与PC值的关系
  8. Unity项目代码书写规范
  9. 让IE和Firefox(包括chrome)浏览器默认产生滚动条的滚动槽
  10. 【Python】基本统计值计算
  11. 汉文博士 0.5.7.2356 版发布
  12. SQL Server 连接查询(多表连接查询)
  13. java留言板源码_jsp留言板示例源码下载(入门级)
  14. 格雷码和二进制之间的转换
  15. 线性规划——单纯形法
  16. 百度地图设置显示定位服务器,百度地图API示例之设置地图显示范围
  17. revit二次开发 IdlingExternalEvent 空闲事件与外部事件
  18. 本世纪最好的NSA!
  19. 数学分析笔记-有限覆盖定理
  20. ThinkPHP6集成腾讯云、短信宝短信发送的工具类

热门文章

  1. 越狱(第二季)19集,开始了!
  2. SSLOJ 1335.蛋糕切割
  3. 前端开发人员需知——浏览器详解
  4. mysql NOW,CURRENT_TIMESTAMP,SYSDATE 之间的区别
  5. LeetCode LRU Cache
  6. Linux下多线程编译
  7. 2014,都要好好的~
  8. HQL (五) 外置命名查询(sql语句单独保存起来)
  9. C#根据字节数截取字符串【转载】
  10. tcp的粘包和拆包示例以及使用LengthFieldFrameDecoder来解决的方法