运算中类型提升的根本原因

205 阅读2分钟

title: 运算中类型提升的根本原因 date: 2017.06.04 16:02 categories:

  • 技术博客 tags:
  • 语言特性
  • Java

正常来说,一个入门的程序员就知道关于表达式中数据运算的类型提升(value promote)规则,有两点:

  • byteshortchar会提升为int类型进行计算
  • 结果类型会提升为参与运算中类型最高的

后者比较容易理解,说到底就是个范围问题,你的结果一定是可以把过程元素装的下的,但是前者为什么会如此设定呢?

1. 发现问题

首先我之前没有想过也确实不知道为什么是这样,直到我逛Stack Overflow看到了这个问题:Bitwise operations in Java using byte and int [duplicate]

接着在里面跳到了这个问题:Why byte and short values are promoted to int when an expression is evaluated [duplicate],又发现跟这个问题:Why does the Java API use int instead of short or byte?也有关联。

2. 看到前辈的解释很直接清晰

3. 基本数据类型占位

  • byte_1byte_8bit
  • short_2byte_16bit
  • int_4byte_32bit
  • long_8byte_64bit
  • char_2byte_16bit
  • float_4byte_32bit
  • double_8byte_64bit
  • boolean_1byte

4. 根本原因

JVM与Java语言设计时的设定如此。

  • 虚拟机本身也是个机器,在内存运用上选择了32bit的标准,对于小于intbyteshortchar直接转成int来运算
  • 字节码的设计更加简洁,从计算的角度看提升了性能,在数值运算的扩张上也预留了空间,不必到时候再手动扩,假如JVMbyte这种类型加入到运算过程就需要更多的transistor,对完善Arithmetic Logic Unit无用
  • 虚拟机运行在32bit系统上,如此更易于实现底层机制
  • 小的数据类型在数组中有所优势,会占用更少的字节,但运算中并无类似的优势