Java学习之旅第一季-13:数值类型的两个补充

13.1 数值字面量的下划线表示

从Java 7开始,可以使用下划线对数值进行分隔以提高可读性,如:

int num1 = 123_456_789;
double num2 = 1_234.56_78;
System.out.println(num1);
System.out.println(num2);

上述代码输出的结果是:123456789 和 1234.5678。

可以看到在编译时,编译器会把下划线移除,并把真实的数值赋值给变量。

除了上述示例中要在十进制数据之外,在八进制、十六进制和二进制格式中,也可以使用下划线。没有任何标点符号(例如,用逗号作为千位分隔符)的大数字难以阅读,而在大数字中使用下划线可使其更易于阅读。

下面的示例都是合法的声明:

int num1 = 0x123_456;                  // 十六进制
int num2 = 0_12345;                    // 八进制
int num3 = 0b1110_0011_1100;            // 二进制
long num4 = 12_3456_7890_0000L;         //大数字 

注意,下划线只能在两个数字之间,这意味着不能在数字字面值的开头或结尾使用下划线,也不能在十六进制格式的前缀(如 0x)和二进制格式的前缀(如 0b)以及长字面值的后缀(如 L)和浮点字面值的后缀(如 F)中使用下划线。例如以下的写法就不成立:

int num1 = _1234;
int num2 = 1234_;

int num3 = 0x_7B1;
int num4 = 1234_L;

float num5= 1234_.5678;
float num6= 1234._5678;

但是在八进制表示时,可以将整型字面值 1969 以八进制格式写成 03661。在八进制格式的整型字面值中,开头的零被视为数字,而非前缀。在八进制格式的整型字面值中,允许在第一个零之后使用下划线,所以下面的赋值没有语法错误:

int num1 = 0_3661;

13.2 数值类型数据之间的转换

之前介绍的数值类型的取值范围从小到大依次为:byte(1字节)、short(2字节)、int(4字节)、long(8字节)、float (4字节)、double(8字节)

Java支持这些数据类型的互相转换。

Java中类型转换有两种基本方式:

1、把某种类型的值转换成取值范围更广的类型,此时执行的是放大转换(widening conversion)。例如,把 int字面量赋值给 double类型的变量和把字符字面量赋值给 int 类型的变量时,Java 会执行放大转换。

double num1 = 1;    //int转换为double
long num2 = 2;      //int转换为long
float num3 = 3L;    //long转换为float

2、另一种方式是缩小转换(narrowing conversion)。把一个值转换成取值范围没那么广的类型时执行的就是缩小转换。缩小转换并不总是安全的,例如把整数 10转换成 byte 类型是合理的,但把 1000 转换成 byte 类型就不合理,因为 byte类型只能介于 -128 和 127 之间。缩小转换可能丢失数据,所以试图缩小转换时 Java 编译器会发出警告,就算转换后的值能落在更窄的取值范围内也会警告:

  byte num4 = 100;
  // byte num5 = 1000;    语法错误

如果需要执行缩小转换,而且确信这么做不会丢失数据或精度,可以使用强制类型转换的语法,即在想转换的值前面加一个括号,在括号里写上希望转换成的类型。

int num6 = 10;
byte num7 = (byte) num6;   // 把int类型强制转换成byte类型
num6 = (int) 12.345;       // 把double字面量强制转换成int类型,得到的是12

下表 列出了各种基本类型能转换成何种其他类型,以及转换的方式。其中带有星号的"自动转换*" 表示自动执行的放大转换,但在转换过程中最低有效位可能丢失。把 int 或 long 类型转换成浮点类型时可能会出现这种情况。浮点类型的取值范围比整数类型广,所以 int 或 long 类型都能用 float 或 double 类型来表示。然而,浮点类型是近似值,所以有效数字不一定总与整数类型一样多。

类型转转

13.3 小结

本小节主要介绍了数值数据字面量的下划线表示法,主要是提高可读性。同时介绍了Java中基本数据类型之间的互相转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值