2.7 类型转换

实际开发工作中,不同类型数据之间的转换工作非常常见,这也是非常重要的操作。本节就讨论几种数据类型转换的情况。

第一种类型转换称为隐式转换。当把一个取值范围小的类型转换为取值范围大的类型时,可以进行隐式转换,就像将一小杯水装进一个大杯子一样,这种转换是没有任何问题的,如下面的代码所示。

    int x = 100;
    long y = x;

代码中,首先定义x变量为int类型(32位整数),定义y变量为long类型(64位整数)。然后,将x的值赋予y,由于long的取值范围要比int类型大,因此这种赋值是没有问题的。

此外,当不同类型的数据进行运算时,会将取值范围小的类型转换为取值范围大的类型,这也是进行隐式转换,前面的内容已经讨论过这类情况。

第二种类型转换的情况是将取值范围大的类型转换为取值范围小的类型,如下面的代码所示。

    long x = 100;
    int y = x;

运行代码可以看到,它们是不能正确执行的。如果确实需要这种转换操作,就必须使用强制转换。此时,在需要转换的数据前使用一对圆括号指定目标类型,如下面的代码所示。

    long x = 100;
    int y = (int)x;

再次执行代码就没有问题了。不过,进行类型的强制转换时需要注意,如果数据超出了目标类型的取值范围,会进行截断操作,数据内容也会改变,实际开发中,应避免这种情况的发生,如下面的代码所示。

代码会显示-24,这是因为byte类型只能处理8位整数,取值范围为-128~127,而1000显然超出了这个范围,转换为byte类型后,数据只保留低位上的8位,于是它就变成了-24,这是怎么得来的呢?

1000的二进制形式为1111101000,只取后8位就是11101000,在byte类型中,第一位是1,说明这是一个负数,进行减1取反操作得到00011000,即24,这样结果就是-24了。

前面讨论的是整数类型之间的转换,如果是整数和浮点数之间的转换,同样会有隐式转换和强制转换两种情况。

从整数转换为浮点数类型时,可以进行隐式转换。但反过来,将浮点数转换为整数时,就会丢失小数部分,如下面的代码所示。

代码中,变量x定义为double类型,其数据包含小数部分。然后,将x的数据转换为int类型(y),可以看到,y的输出是1000,即不包含小数部分。接下来,将double类型转换为取值范围更小的byte类型(z)时,数据会先截断小数部分,再截断整数部分,最终存放在byte类型的变量中。