一个非常艰苦的面试问题可能是这样的:

int i = Integer.MAX_VALUE;
i += 0.0f;
int j = i;
System.out.println(j == Integer.MAX_VALUE); // true

为什么打印出正确的文字?

乍一看,答案似乎很明显,直到您意识到如果长时间更改int,事情都会变得很奇怪:

long i = Integer.MAX_VALUE;
i += 0.0f;
int j = (int) i;
System.out.println(j == Integer.MAX_VALUE); // false
System.out.println(j == Integer.MIN_VALUE); // true

您可能会想什么呢? Java何时成为JavaScript?

首先,让我解释为什么长时间会产生如此奇怪的结果。

关于+ =的重要细节是它进行隐式强制转换。 您可能会认为:

a += b;

是相同的:

a = a + b;

基本上,除了大部分时间无关紧要之外,还有一个细微的差别:

a = (typeOf(a)) (a + b);

加法的另一个微妙特征是结果是两种类型的“范围更大”。 这意味着:

i += 0.0f;

实际上是:

i = (long) ((float) i + 0.0f);

将Integer.MAX_VALUE转换为浮点数时,会出现舍入错误(因为浮点数的尾数为24位),导致该值比开始时多一个。 即它与:

i = Integer.MAX_VALUE + 1; // for long i

当您再次将Integer.MAX_VALUE + 1转换为int时,将发生溢出,并且具有:

Integer.MIN_VALUE;

j = Integer.MIN_VALUE;

那么,为什么长得到意外的值,而int恰好得到预期的值呢?

原因是当从浮点数舍入到整数时,它会舍入到0,直到最接近的可表示值。 从而:

int k = (int) Float.MAX_VALUE; // k = Integer.MAX_VALUE;
int x = (int) (Integer.MAX_VALUE + 1.0f) // x = Integer.MAX_VALUE;

注意:Float.MAX_VALUE / Integer.MAX_VALUE是1.5845632E29,这真是一个错误,但最好的int可以做到。

简而言之,对于int值Integer.MAX_VALUE,语句i + = 0.0f; 导致该值先跳一(强制转换为浮点数),然后再跳一(强制转换为int值),以便您获得开始时的值。

翻译自: https://www.javacodegeeks.com/2014/10/a-java-conversion-puzzler-not-suitable-for-work-or-interviews.html

Java转换难题者,不适合工作(或面试)相关推荐

  1. 有什么好的Java自学教程视频,适合初学者

    动力节点Java培训最新上线Java实验班,等你来测试自己适不适合学习Java编程哦! 随着互联网的发展,视频教程充斥着网络,很多人为了能够在视频教程中捞取一桶金,纷纷投入视频售卖的大军之中,其中不乏 ...

  2. Java后端程序员1年工作经验总结

    java后端1年经验和技术总结(1) 1.引言 毕业已经一年有余,这一年里特别感谢技术管理人员的器重,以及同事的帮忙,学到了不少东西.这一年里走过一些弯路,也碰到一些难题,也受到过做为一名开发却经常为 ...

  3. 各种实用的音频文件在线工具,一款解决所有转换难题

    每次在工作中,不管是在职场新人,还是职场老油条啊 都会经常碰到有人在问啥有比较好的办法把音频文件互相转换啊, 或者是谁能把QSV转MP4,等等这些问题,每次听到这些问题,我就笑了, 这些办公文件格式转 ...

  4. 给即将在今年九十月份找工作立志从事java开发的同学分享一下常见的面试题目!

    1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.Java有 ...

  5. Java后端程序员1年工作经验和技术总结

    本文转载自:Java后端程序员1年工作经验和技术总结 1.引言  毕业已经一年有余,这一年里特别感谢技术管理人员的器重,以及同事的帮忙,学到了不少东西.这一年里走过一些弯路,也碰到一些难题,也受到过做 ...

  6. 自学java去哪找工作比较好_如何自学java?什么程度可以找工作?

    我个人学习Java就是自学的,所以还是有一些发言权,我是非计算机专业,上大三的时候想做程序员,因为感觉本专业不挣钱,用了一年的时间在学校自学了Java,学习的过程中无非就是两个字最重要:坚持. 因为学 ...

  7. 磨刀不误砍柴 - 配置适合工作学习的桌面环境

    本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载.或重新修改使用,但需要注明来源. 署名 4.0 国际 (CC BY 4.0) 本文作者: 苏洋 创建时间: 2018年09月2 ...

  8. php和java哪个好学,哪个好找工作,好就业

    php和java哪个好学,哪个好找工作,好就业 PHP和Java哪个好?这个问题应该会有很多人问,但是每种编程语言都有各自的优缺点,所谓的哪个好,不过就是看你习惯于使用哪种或者说你更擅长于哪种,所以今 ...

  9. java培训机构如何选择适合自己的

    java培训机构如今在市面上是越来越多了,主要还是大多数人想要进入到互联网行业,都会先选择学习java技术,那么下面我们就来详细的了解一下java培训机构如何选择适合自己的吧. java培训机构如何选 ...

最新文章

  1. mysql 客户端提示“Cannot proceed because system tabl...
  2. C++中 #include与#include
  3. CSS实战经验:灵活运行注释带来的益处(转载)
  4. GitHub最火热的30个开源机器学习框架
  5. yolo3连接网络摄像头实现目标检测命令
  6. 学习笔记12JS异步请求
  7. 【项目管理】------九大项目管理框架 (
  8. 怎么获取c++股票数据接口?
  9. 微弱信号检测_世界上最轻薄的信号放大器:可精准监测生物信号!
  10. 文档服务器 件排名,十大服务器排名
  11. RootKit分析:主页保安推广病毒+独狼2 排查与分析全过程
  12. 微信小程序实现下拉框功能
  13. 闪电分镜 一款影视前期策划的完美解决方案
  14. 小Q得到一个神奇的数列: 1, 12, 123,...12345678910,1234567891011...。
  15. android画笔大小,android之画板功能之橡皮擦 画笔大小和画笔颜色
  16. 数组的push()、pop()、shift()和unshift()方法
  17. EXCEL多列内容合并且中间加字符串
  18. ping不通外网 连不上外网
  19. 2020-10-7 CCNA学习笔记
  20. Parameter 'arg0' not found. Available parameters are [xxx, xxx, param1, param2]

热门文章

  1. double类型进行比较排序
  2. stream流把list转为map
  3. list 置顶元素_java集合指定元素排序:最前,按照提供的顺序排序?求算法
  4. 不同范数下的余弦定理_第06题 | 从源头追溯「余弦定理」amp; 文理科知识点的异同...
  5. 反射、HashMap、ArrayList与LinkedList区别
  6. sql server 2008安装_性能不够?基于时序数据库的Zabbix 5.2安装指南
  7. jvm(1)-走进java
  8. java继承中的 equals + hashCode+toString
  9. derby数据库的数据_Derby数据库备份
  10. rabbitmq 传递文件_使用RabbitMQ进行消息传递