title: 运算中类型提升的根本原因 date: 2017.06.04 16:02 categories:
- 技术博客 tags:
- 语言特性
- Java
正常来说,一个入门的程序员就知道关于表达式中数据运算的类型提升(value promote)规则,有两点:
byte、short、char会提升为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_8bitshort_2byte_16bitint_4byte_32bitlong_8byte_64bitchar_2byte_16bitfloat_4byte_32bitdouble_8byte_64bitboolean_1byte
4. 根本原因
JVM与Java语言设计时的设定如此。
- 虚拟机本身也是个机器,在内存运用上选择了32bit的标准,对于小于
int的byte、short、char直接转成int来运算 - 字节码的设计更加简洁,从计算的角度看提升了性能,在数值运算的扩张上也预留了空间,不必到时候再手动扩,假如
JVM将byte这种类型加入到运算过程就需要更多的transistor,对完善Arithmetic Logic Unit无用 - 虚拟机运行在32bit系统上,如此更易于实现底层机制
- 小的数据类型在数组中有所优势,会占用更少的字节,但运算中并无类似的优势