java中有八种基本数据类型
类型 | 数据类型名称 | 占用字节数(一个字节是8位) | 数据范围 | 默认值 | 包装类 |
数值型 | byte | 1 | -128~127 | 0 | Byte |
数值型 | short | 2 | -2^15~2^15-1 | 0 | Short |
字符型 | char | 2 | \u0000 | Character | |
数值型 | int | 4 | -2^31~2^31-1 | 0 | Integer |
数值型 | long | 8 | -2^63~2^63-1 | 0L | Long |
数值型 | float | 4 | 3.402823e+38~1.401298e-45 | 0.0f | Float |
数值型 | double | 8 | 1.797693e+308~4.9000000e-324 | 0.0d | Double |
布尔 | boolean | 1位 | FALSE | Boolean |
按照取值范围做排列如下:
double > float > long > int > short > byte
数据类型之间存在转换的问题,转换分为自动转换和强制转换。
自动转换:隐式的,无需声明
强制转换:显式的,需要特别声明
1.自动转换
取值范围从小转换到大,是可以直接转换的,而从大转成小,或转成 char 类型,则必须使用强制转换。
在自动类型转化中,除了以下几种情况可能会导致精度损失以外,其他类型的自动转换不会出现精度损失。
》int--> float
》long--> float
》long--> double
》float --> double
除了可能的精度损失外,自动转换不会出现任何运行时(run-time)异常。
2.强制转换
如果要把大的转成小的,或者在short与char之间进行转换,就必须强制转换。
这也被称作缩小转换(narrowing conversion),因为必须显式地使数值更小以适应目标类型。
强制转换的格式和实例如下:
long lo = 99;
int i = (int) lo;
严格地说,byte转为char不属于(narrowing conversion),因为从byte到char的过程其实是byte-->int-->char,所以widening和narrowing都有。
强制转换可能会损失精度,主要有两种场景
1、整数类型之间相互转换,如果整数超出目标类型范围,会对目标类型的范围取余数。
2、从浮点类型转成整数类型,会发生截尾(truncation),也就是把小数的部分去掉,只留下整数部分。此时如果整数超出目标类型范围,一样将对目标类型的范围取余数。
类型自动提升
在表达式计算过程中会发生类型转换,这些类型转换就是类型提升,类型提升规则如下:
- 所有 byte/short/char 的表达式都会被提升为 int
- 除以上类型,其他类型在表达式中,都会被提升为取值范围大的那个类型,例如有一个操作数为double,整个表达式都会被提升为double