zoukankan      html  css  js  c++  java
  • (二十一)类型转换指令

    一、概念

    • 类型转换指令可以将两种 Java 虚拟机数值类型进行相互转换,这些转换操作一般用于实现用户代码的显式类型转换操作,或者用来处理 Java 虚拟机字节码指令集中指令非完全独立独立的问题。
    • Java 虚拟机直接支持(译者注:“直接支持”意味着转换时无需显式的转换指令)以下数值的宽化类型转换(Widening Numeric Conversions,小范围类型向大范围类型的安全转换):
    1. int 类型到 long、float 或者 double 类型
    2.  long 类型到 float、double 类型
    3.  float 类型到 double 类型
    • 窄化类型转换(Narrowing Numeric Conversions)指令包括有:i2b、i2c、i2s、l2i、f2i、f2l、d2i、d2l 和 d2f。窄化类型转换可能会导致转换结果产生不同的正负号、不同的数量级,转换过程很可能会导致数值丢失精度。 
    • 在将 int 或 long 类型窄化转换为整数类型 T 的时候,转换过程仅仅是简单的丢弃除最低位N 个字节以外的内容,N 是类型 T 的数据类型长度,这将可能导致转换结果与输入值有不同的正负号(译者注:在高位字节符号位被丢弃了)。 
    • 在将一个浮点值转窄化转换为整数类型 T(T 限于 int 或 long 类型之一)的时候,将遵循以下转换规则:
       如果浮点值是 NaN,那转换结果就是 int 或 long 类型的 0
       否则,如果浮点值不是无穷大的话,浮点值使用 IEEE 754 的向零舍入模式(§2.8.1)
      取整,获得整数值 v,这时候可能有两种情况:
               如果 T 是 long 类型,并且转换结果在 long 类型的表示范围之内,那就转换为 long
                类型数值 v
          如果 T 是 int 类型,并且转换结果在 int 类型的表示范围之内,那就转换为 int
               类型数值 v
       否则:
                如果转换结果 v 的值太小(包括足够小的负数以及负无穷大的情况),无法使用 T 类
                   型表示的话,那转换结果取 int 或 long 类型所能表示的最小数字。
               如果转换结果 v 的值太大(包括足够大的正数以及正无穷大的情况),无法使用 T 类
                  型表示的话,那转换结果取 int 或 long 类型所能表示的最大数字。
      从 double 类型到 float 类型做窄化转换的过程与 IEEE 754 中定义的一致,通过 IEEE 754
      向最接近数舍入模式(§2.8.1)舍入得到一个可以使用 float 类型表示的数字。如果转换结果
      的绝对值太小无法使用 float 来表示的话,将返回 float 类型的正负零。如果转换结果的绝对值
      太大无法使用 float 来表示的话,将返回 float 类型的正负无穷大,对于 double 类型的 NaN
      值将就规定转换为 float 类型的 NaN 值。
      尽管可能发生上限溢出、下限溢出和精度丢失等情况,但是 Java 虚拟机中数值类型的窄化转
      换永远不可能导致虚拟机抛出运行时异常(此处的异常是指《Java 虚拟机规范》中定义的异常,
      请读者不要与 IEEE 754 中定义的浮点异常信号产生混淆)

    二、案例

    • 源码如下:
    package jvm;
    
    public class TypeTranster {
    
        public static void add() {
            
            int hour = 24;
            
            long mi = hour * 60 * 60 * 1000;
            long mic =(long)hour * 60 * 60 * 1000 * 1000;
            System.out.println(mic/mi);
        }
        
        public static void main(String[] args) {
            add();
        }
        
    }
    • 字节码操作指令分析如下:

    下图中的args_size=0,上文说的每个方法都会自动加个this,但是这是方法是static方法,所有没有this,所以args_size=0

  • 相关阅读:
    Git 命令 stash cherry-pick reset rebase
    【操作系统】不同语言的线程实现机制对比及数据库锁问题
    【数据结构】搜索二叉树(BST)和普通二叉树的序列化与反序列化
    【自制编译器】读书笔记 -- JavaCC使用的JJ文件格式
    leetcode 874 Robot Simulation
    hihocoder 编程挑战赛75
    浪漫主义的起源--以赛亚柏林
    【美团笔试 2018-4-20 】编程题-1 测例100%通过 欧拉函数求解gcd
    【POJ SOJ HDOJ】HDU 2196 Computer 树中的最长路径
    【Java 核心】多线程笔记
  • 原文地址:https://www.cnblogs.com/shyroke/p/9068163.html
Copyright © 2011-2022 走看看