当前位置: 首页 > news >正文

【JVM笔记】类型转换字节码指令

目录

宽化类型转换

转换规则

精度损失问题

补充说明

窄化类型转换

转换规则

精度损失问题

补充说明


宽化类型转换

转换规则

Java 虚拟机直接支持以下数值的宽化类型转换(widening numeric conversion, 小范围类型向大范围类型的安全转换)。也就是说,并不需要指令执行,包括:

● 从 int 类型到 long、 float 或者 double 类型。对应的指令为:i2l、i2f、i2d

● 从 long 类型到 float、double 类型。对应的指令为:l2f、l2d

● 从 float 类型到 double 类型。对应的指令为:f2d

简化为:int --> long --> float --> double

精度损失问题

宽化类型转换是不会因为超过目标类型最大值而丢失信息的,例如,从 int 转换到 long,或者从 int 转换到 double,都不会丢失任何信息,转换前后的值是精确相等的

从 int、 long 类型数值转换到 float,或者 long 类型数值转换到 double 时,将可能发生精度丢失一可能丢失掉几个最低有效位上的值,转换后的浮点数值是根据 IEEE754 最接近舍入模式所得到的正确整数值

尽管宽化类型转换实际上是可能发生精度丢失的,但是这种转换永远不会导致 Java 虚拟机抛出运行时异常

补充说明

从 byte、char 和 short 类型到 int 类型的宽化类型转换实际上是不存在的。对于 byte 类型转为 int,虚拟机并没有做实质性的转化处理,只是简单地通过操作数栈交换了两个数据。而将 byte 转为 long 时,使用的是 i2l,可以看到在内部 byte 在这里已经等同于 int 类型处理,类似的还有 short 类型

窄化类型转换

转换规则

Java 虚拟机也直接支持以下窄化类型转换:

● 从 int 类型至 byte、short 或者 char 类型。 对应的指令有:i2b、i2c、i2s

● 从 long 类型到 int 类型。对应的指令有:l2i

● 从 float 类型到 int 或者 long 类型。对应的指令有: f2i、 f2l

● 从 double 类型到 int、long 或者 float 类型。对应的指令有:d2i、 d2l、d2f

精度损失问题

窄化类型转换可能会导致转换结果具备不同的正负号、不同的数量级,因此,转换过程很可能会导致数值丢失精度

尽管数据类型窄化转换可能会发生上限溢出、下限溢出和精度丢失等情况,但是 Java 虛拟机规范中明确规定数值类型的窄化转换指令永远不可能导致虚拟机抛出运行时异常

补充说明

当将一个浮点值窄化转换为整数类型 T (T 限于 int 或 long 类型之一)的时候,将遵循以下转换规则:

如果浮点值是 NaN,那转换结果就是 int 或 long 类型的 0

如果浮点值不是无穷大的话,浮点值使用 IEEE754 的向零舍入模式取整,获得整数值 v,如果 v 在目标类型 T(int 或 long)的表示范围之内,那转换结果就是 v。否则,将根据 v 的符号,转换为 T 所能表示的最大或者最小正数

当将一个 double 类型窄化转换为 float 类型时,将遵循以下转换规则:

通过向最接近数舍入模式舍入一个可以使用 float 类型表示的数字。最后结果根据下面这 3 条规则判断:

如果转换结果的绝对值太小而无法使用 float 来表示, 将返回 float 类型的正负零

如果转换结果的绝对值太大而无法使用 float 来表示, 将返回 float 类型的正负无穷大

对于 double 类型的 NaN 值将按规定转换为 float 类型的 NaN 值

相关文章:

  • 聚观早报 | 东方甄选与顺丰、京东合作;拼多多跨境电商平台上线
  • 如何创建并运行java线程呢?
  • dubbo安装跟部署
  • ESP8266-Arduino编程实例-QRE1113红外反射传感器
  • 【Django】REST_Framework框架——Mixin类和GenericAPIView中的视图子类源码解析
  • Springboot、Tomcat启动加载外部指定文件夹下的jar文件
  • MySQL教程 - 索引(Index)
  • 神经网络做预测的原理,神经网络预测空气质量
  • java代码审计的点
  • alsa-lib和alsa-utils移植
  • SAP 电商云 Spartacus 服务器端渲染的单步调试详细步骤
  • 尚硅谷Vue系列教程学习笔记(12)
  • Flutter 高级教程之如何开发iOS Widget小组件展示SQLite本地数据库数据(教程含完整源码)
  • 5大指标:评估RPA项目的ROI,实现投资回报最大化
  • 神经网络模型的基本原理,神经网络模型是干嘛的
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • Angular 响应式表单 基础例子
  • download使用浅析
  • interface和setter,getter
  • MD5加密原理解析及OC版原理实现
  • MySQL数据库运维之数据恢复
  • PHP的类修饰符与访问修饰符
  • Terraform入门 - 1. 安装Terraform
  • Vue 重置组件到初始状态
  • 电商搜索引擎的架构设计和性能优化
  • 多线程 start 和 run 方法到底有什么区别?
  • 浮现式设计
  • 关于List、List?、ListObject的区别
  • 普通函数和构造函数的区别
  • 微信开放平台全网发布【失败】的几点排查方法
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • kubernetes资源对象--ingress
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • #pragma multi_compile #pragma shader_feature
  • (12)Linux 常见的三种进程状态
  • (done) 两个矩阵 “相似” 是什么意思?
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (十)c52学习之旅-定时器实验
  • (新)网络工程师考点串讲与真题详解
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)shell调试方法
  • .NET 8.0 发布到 IIS
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 动态调用WebService + WSE + UsernameToken
  • .Net 路由处理厉害了
  • .NET 使用配置文件
  • .NET 中创建支持集合初始化器的类型
  • .NET/C# 的字符串暂存池