JAVA数据类型总结及一些常见问题

JAVA数据类型总结及一些常见问题

Java是一种强类型语言,定义数据类型十分严格,我们知道,每一个变量其实就是内存当中的一小块区域,那么这个区域有多大?这就需要数据类型来为其分配内存大小空间。
Java一共有8种基本类型(primitive type)
整型:byte、short、int、long
浮点型:float、double
布尔型:boolean
字符型:char

对于整型,我们有如下表
在这里插入图片描述

通常情况下int已经足够保存我们使用的绝大多数数据,而long常用于日期,时间以及文件内存大小的表示上。
在Java中,整型的范围与运行Java代码的机器是无关的,这就解决了在同一个平台上不同操作系统之间移植代码时带来的诸多问题。同时,Java所有的数据类型所占用的字节数量与平台是无关的,这与C和C++有区别,在C与C++中,int和long等类型在不同的平台上占用空间是不相同的,在16位机上int占用2个字节,在32位机上int占用4个字节,这无疑加大了跨平台的难度。从这些地方可以看出java跨平台的优良性能。

关于浮点型:
float需要占用4个字节空间,double需要占用8个字节空间,float的有效数位在6~7位,而double有效数位在15位,所以也称为双精度浮点型。通常情况下大部分采取double而很少使用float。

下面谈一谈关于数据类型转换的情况
JAVA中有自动类型提升的机制,具体情况如下:
byte、short、char参与运算时,会自动提升数据类型为int
float、long、double参与运算时,其他操作数会自动提升为float、long、double

下图是几种数据类型转换的关系网络(借鉴自JAVA核心卷一p41页),其中实线箭头代表无损失的转换,虚线代表可能会有精度的损失。

在这里插入图片描述
这个应该不难理解,就拿int和double来说,double是比int范围更大的“容器”,用更大的容器存储小的容器自然不会丢失数据的精度。

下面举几个例子:

int n = 123456789;
float f = n;

int型变量比float变量所能包含的位数要多,因此在发生二元运算时,int会自动提升类型转型为float,这时float长度不够存下该数字,因此会出现数据的精度损失。
再观察:

byte b = 2;
byte c = b+3;

乍一看没什么问题,这时运行会编译报错,原因在于,byte参与运算会自动提升类型为int,而c是byte类型,无法存下int这种更大的“容器”。

short b = 2;
long l = 20l;
int a = b+l;

这里错误类型同上,因为存在long,所以short首先自动提升类型转型为long,但是int无法存下比它更大的容器long,因此编译报错。

再来谈一谈关于强制类型转换,在某些时候,我们需要将double容器用int容器来承载,Java允许这种数据类型的强制转换,当然会有代价,那么就是有可能会丢失精度
强制类型转换的用法是在圆括号中给出想要转换的目标类型。
举个例子:

byte a = 20;
byte b = 10;
byte c = (byte)(a+b);

c=30,这里并没有发生溢出,因为byte的取值范围是一个字节,-128~127之间。
另外,试图将一个类型强制转换为另外一个类型,而又超出了该类型的范围,那么就会发生截断从而出现一个完全不同的值,比如:

byte c = (byte)130;

c = -126,这时130已经超出了byte所能表示的范围,如何计算这个值涉及到反码补码的运算
13 0 ( 2 ) 130_ {(2)} =00000000 00000000 00000000 10000010 原码
强制用byte接收该数据,则前三个字节将被截去,剩下10000010 原码
反码:11111101
补码:11111110 =-126
说到这里,就再提一个关于运算符的问题

byte a = 10;
a = a+10;
byte a = 10;
a += 10;

乍一看没什么区别,但是事实是前者会报错,而后者不会,原因如下:
对于前者,byte参与运算后,自动提升为int而导致编译报错
对于后者,"+="运算符存在着自动强制类型转换,在这里,当等号左右两边数据类型不同时,发生强制转换,a+=10,等同于a=(byte)(a+10).
就先说这么多吧。

猜你喜欢

转载自blog.csdn.net/qty4505861/article/details/82833047
今日推荐