课时10:Java数据类型划分(整型类型)
摘要:本文主要围绕Java中整型数据展开,详细讲解整型变量、常量的概念,整型数据运算规则,包括数据溢出问题及解决方法,数据类型转换(自动转换与强制转换)的原理和注意事项,同时介绍了整型数据默认值的相关知识,以及byte数据类型与int数据类型的关系和使用场景,帮助读者全面掌握Java整型数据的相关内容。
1. 整形常量与变量
2. 整形数据溢出问题
3. 解决数据溢出的方案
4. 数据类型的转换
5. 整型数据的默认值问题
6. byte数据类型与int数据类型的关系
01、 整型变量与常量
在Java程序中,任何整数常量的类型都是int型。例如,定义一个整型变量的代码可以这样写:在新建的`test demo.java`
程序中,编写`int num=10`
。这里的`10`是一个整数常量,它的值不会改变。程序中,任何整数常量的类型都是int型,将一个整数常量赋值给int型变量是合理的。
如果执行`num*2`,由于`num`是int型变量,`2`是int型常量,按照Java的运算规则,`int`类型数据相乘,结果依然是`int`型。执行代码后可以验证结果是否符合预期。
02、 整型数据的溢出问题
在进行整型数据操作时,会存在数据溢出问题。当整型数据达到其最大或最小值后继续进行数学计算,就可能产生错误数据。
关于变量命名的要求:第一个单词的字母小写,而后每个单词的首字母大写:
例如:maxValue;通过代码示例来观察,
定义`int maxValue=Integer.MAX_VALUE`获取最大值, `int minValue=Integer.MIN_VALUE`获取最小值。 输出这两个值,会得到最大值`2147483647`和最小值`-2147483648`。 在跟上System.out.println(maxValue); System.out.println(minValue); System.out.println(maxValue+1); System.out.println(minValue-1);
当执行`maxValue+1`时,理论上结果应该还是`int`型,但由于`maxValue`已经是最大值,加1后发生数据溢出,编译执行后结果变成了最小值;同样,`minValue-1`的结果变成了最大值。如果继续进行`minValue-2`操作,编译执行后会得到次最大值,这表明数据计算在超出数据类型范围后出现了偏差。当已经超过了数据类型的局限之后数据的计算就会出现偏差。所以一定要在操作前预估数据大小。
03、 解决整型数据溢出的方案
既然`int`型存在溢出问题,解决方法是更换更大的数据类型,即`long`型。但直接使用`long`型处理`int`型溢出问题时,也可能存在陷阱。
例如,`longresult=maxValue+1`,由于程序执行顺序是从等号右边到左边,先在一个区域保存`maxValue+1`的计算结果(此时仍按`int`型计算,会产生溢出),再将结果赋值给`long`型变量,所以结果依然会有溢出问题。解决方式:更换更大的数据类型
范例:使用long来解决int的数据溢出问题。
在使用此类方式处理之前请一定要注意一个问题,所有的程序的执行顺序都是由等号的右边到左边,也就是说,如果你现在使用了 int 进行计算,那么计算结果依然会有溢出,所以最简化的做法是将其中的一个变量,首先做内容的扩充而扩充有两种实现方式。
(1)先将`int`变量的内容赋值给`long`变量,再进行计算。如先将`maxValue`赋值给一个`long`型变量,然后再对该变量进行加1操作。
(2)直接将某一个`int`
型变量变为`long`
型。例如,在`maxValue+1
`前加上`long
`,表示先将`int`
型的`maxValue`变为`long`型
,再加上`int`型常量`1`
,结果就是`long`类型
。
通过这两种方式处理后,编译执行代码,就可以得到正常的计算结果。
04、 数据类型的转换
任何数据的整型都是int,但是该数据已经超过了int可以保存的数据范围,那么现在就需要将这个数据明确的表示是一个long型的常量。
(1)由大变小的转换
数据范围大的数据类型变为数据范围小的数据类型需要强制转换,但强制转换可能会丢失精度。例如,当一个大于`int`最大范围的数值要赋值给`int`型变量时,需要明确表示该数值是`long`型常量(在数值后加`l`或`L`,建议加大`L`)。
比如system.out.println(11+1l)
;容易混淆。如果不进行强制转换,直接赋值,编译时会报错“过大的整数”。
(2)由小变大的转换
在Java中,数据范围小的数据类型可以自动转换为数据范围大的数据类型,这在数学计算中是自动进行的。例如,`long`型和`int`型进行计算时,`int`型会自动转换为`long`型,然后再进行计算。
强制转换时,要设置目标类型。例如,将一个超出`int`范围的`long`型数据强制转换为`int`型,编译执行后,由于数据范围变小,可能会丢失精度,导致结果不符合预期,如得到最小值等情况。范围小的数据类型可以自动变换为范围大的数据类型。数据范围大的数据类型只有强制转换才能转换为范围小的数据类型。
在实际开发中,尽量避免进行这种可能丢失精度的强制转换操作,除非有特殊需求。面试时可能会遇到相关问题,比如60的阶乘一定不是int能装下的,不确定大小就用long类型。
05、 整型数据的默认值问题
在Java中,所有数据类型都有默认值。在方法声明中,如果定义了变量int num但未给其默认值,直接使用该变量会报错,提示“可能尚未初始化”。
解决这个问题有两种方案:
(1)在使用变量前进行赋值,如`num=10
`,然后再输出变量。但这种方式在老版本的JDK中可能会出错。
(2)在定义变量时直接赋值,这是所有JDK通用的做法,也是最保险的方式。例如`int num=10
`,这样可以确保程序正常运行。
而对于各个数据类型的默认值的时候,需要结合到类的情况下才可以观察到。
06、 byte数据类型与int数据类型的关系
(1)byte数据类型的范围
`byte`数据类型可以保存的范围是`-128`到`+127`之间。
(2)与int数据类型的转换
当声明一个`byte`变量并赋值为`10`时,虽然`10`是`int`型,但由于其数据量在`byte`范围内,所以编译执行不会报错,也不需要进行强制转换。
如果为`byte`变量赋值的内容大于`byte`的范围,如赋值为`128`,编译时会提示“不兼容类型”,此时需要进行强制转换。强制转换后,值会变为`-128`,这是因为数据溢出。
需要注意的是,如果要将`int`值直接赋值给`byte`变量,只能是常量,不能是`int`变量。例如,`intnum=10`
(`10`在`byte`范围内),但如果直接将`num`赋值给`byte`变量,编译时会提示从`int`转换可能会损失精度,依然需要加上强制转换操作。在实际开发中,`byte`和`int`一起使用时进行转换操作存在弊病,尽可能避免,`byte`更多用于二进制流或编码转换等场景。