8种基本类型 及 相互转换

时间:2022-01-15 14:40:17

一、八种基本类型数据(注:一个汉字2个字节)

在Java中一共有8种基本数据类型,其中有4种整型,2种浮点类型,1种用于表示Unicode编码的字符单元的字符类型和1种用于表示真值的boolean类型。(一个字节等于8个bit)


1.整型
类型              存储需求     bit数    取值范围      备注
int                 4字节           4*8 
short             2字节           2*8    -32768~32767
long              8字节           8*8
byte              1字节           1*8     -128~127

2.浮点型
类型              存储需求     bit数    取值范围      备注
float              4字节           4*8                  float类型的数值有一个后缀F(例如:3.14F)
double          8字节           8*8                       没有后缀F的浮点数值(如3.14)默认为double类型

3.char类型
类型              存储需求     bit数     取值范围      备注
char              2字节          2*8

4.boolean类型
类型              存储需求    bit数    取值范围      备注
boolean        1字节          1*8      false、true


补充:Java有一个能够表示任意精度的算书包,通常称为“大数值”(big number)。虽然被称为大数值,但它并不是一种Java类型,而是一个Java对象。

如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有用的类:BigIntegerBigDecimal(Android SDK中也包含了java.math包以及这两个类)这两个类可以处理包含任意长度数字序列的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。具体的用法可以参见Java API。

二、八种基本类型数据之间的转换

在Java程序中,不同的基本类型的值经常需要进行相互转换。

Java语言所提供的7种数值类型之间可以相互转换,有两种类型转换方式:自动类型转换和强制类型转换。


自动类型转换

Java所有的数值型变量可以相互转换,如果系统支持把某种基本类型的值直接赋给另一种基本类型的变量,则这种方式被称为自动类型转换。

当把一个表数范围小的数值或变量直接赋给另一个表数范围大的变量时,系统将可以进行自动类型转换,否则就需要强制转换。


表数范围小的可以向表数范围大的进行自动类型转换,就如同有两瓶水,当把小瓶里的水倒入大瓶中时不会有任何问题。

Java支持自动类型转换的类型如下所示,左边的数值类型可以自动类型转换成箭头右边的数值类型。

1),byte->short->int->long->float->double

2),char->int->long->float->double

<span style="font-size:14px;">public static void main(String[] args)
{
// 下面3行代码int类型自动转换成float类型
int a = 6;
long b = a;
System.out.println(b);
}</span>


当把任何基本类型的值和字符串值进行连接运算时,基本类型的值将自动类型转换为字符串类型,虽然字符串类型不是基本类型,而是引用类型

如果希望把基本类型的值转换为对应的字符串时,可以把基本类型的值和一个空字符串进行连接。

<span style="font-size:14px;">public static void main(String[] args)
{
// 一个基本类型的值和字符串进行连接运算,基本类型的值自动转换成字符串
int a = 6;
System.out.println(a + "");
// 下面的语句输出7LinkinPark
System.out.println(3 + 4 + "LinkinPark");
// 下面的语句输出LinkinPark34
System.out.println("LinkinPark" + 3 + 4);
}</span>


强制类型转换

如果希望上面自动转换中,箭头右边的类型转换成左边的类型,则必须进行强制类型转换。

强制类型转换的语法格式:(targetType)value,强制类型转换的运算符是圆括号(())。

当进行强制类型转换时,类似于把一个大瓶子里面的水倒入一个小瓶子,如果大瓶子里面的水不多还好,如果大瓶子里面的水很多,将会引起溢出,从而造成数据丢失。

这种类型也称为缩小转换。

注意:当试图强制把表数范围大的类型转换为表示范围小的类型时,必须格外小心,因为非常容易引起信息丢失

<span style="font-size:14px;">public static void main(String[] args)
{
// 下面3行代码输出-23,典型的溢出
int intValue = 233;
byte byteValue = (byte) intValue;
System.out.println(byteValue);
// 下面3行代码输出3,典型的信息丢失
double doubleValue = 3.14;
int iValue = (int) doubleValue;
System.out.println(iValue);
}</span>


表达式类型的自动提升

当一个算数表达式包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。

Java定义了如下的自动提升规则:

1),所有的byte类型,short类型和char类型将被提升到int类型

2),整个算术表达式的数据类型自动提升到表达式中最高等级操作数同样的类型

<span style="font-size:14px;">public static void main(String[] args)
{
// 下面2行代码出错,shortValue类型参与运算,类型自动提升到int
// 将一个int类型的值赋给一个short类型的值,编译不过
short shortValue = 5;
shortValue = shortValue - 2;
// 下面4行代码正确,3个不同类型的值参与运算,类型提升到最高的类型
// double,int,byte中,double类型最高,所以结果double类型
byte byteValue = 4;
int intValue = 1;
double doubleValue = 2.33;
double result = byteValue + intValue + doubleValue;
System.out.println(byteValue + intValue + doubleValue);
// 下面代码的类型同样为double
System.out.println(doubleValue / intValue);
}</span>