(三) 数据类型_数据类型转换

数据类型

八大基本数据类型

Java是一门强类型语言。声明变量时必须写数据类型。
八大基本数据类型
在这里插入图片描述
Java中默认类型:整型类型是int、浮点类型是double。

整形

java中有三种方式表示整形
[1] 十进制(推荐).99,100,-20
[2] 八进制.以0开始。e.g: 017=> 1x81+7x80 = 15
[3] 十六进制.以0x开始 e.g:0x17 = 1x161+7x160 = 23

十六进制(简写为hex或下標16)在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F表示,其中:A到F相当于十进制的10到15,这些称作十六进制数字。

整形根据其内存长度分为byte、short、int、long类型。

byte 占1个字节
byte 表示的最小的数 0000 0000 => 0
byte 表示的最大的数 1111 1111 => 255
0-255 表示256种状态。如果考虑负数 byte取值范围为[-128,127]

数据类型
Java语言的整型常数默认为int型,声明long型常量可以后加‘ l ’或‘ L ‘(建议使用大写,小写容易误认为数字1)

浮点类型

浮点型也称小数类型。分为float和double两种类型
float 类型也称为单精度,能精确到6-7位有效数字。第6位一定可以精确到,第7位可能可以精确到。
double 类型也称为双精度,能精确15-16位有效数字。第15位一定可以精确到,第16位可能可以精确到。
Java浮点类型常量的两种表示形式 [ 未找到 ]  [ Loading... ]
浮点数值默认为double类型。要将其变为float类型,需要在后面增加F/f. 如: 3.14F
float a = 1.5f
double b = 1.55d;
float和double储存空间大小对比 [ 未找到 ]  [ Loading... ]

注意:
浮点数不能用于比较。
0.1不等于 1.0 / 10


在Java中,因为浮点数的精度不确定,使用float或double都会有精度的丢失,在程序运行中,将浮点数进行比较会出现程序检查不出来的错误,(该错误不会报错)但结果会出现错误。一般情况不会出现这种错误,但可能会在变量引用的情况下,将浮点数进行比较,因此这里需要重点注意。

字符类型

在java中通过单引号(‘’)引起来的单个字符称为字符类型(char)。双引号(“”)引起来的0个或者以上内容称为字符串(String).
‘A’、‘中’
“abc”、“a”、“”

char类型表示的是unicode编码表中的字符。占两个字节。

public static void main(String[] args){
	//字符类型变量
	char c = 'a';
	int i = 1;
	//字符类型和int类型计算
	System.out.println(c+i);//输出结果是98
}
字符数值
048
957
A65
Z90
a97
z122

在char类型和int类型计算的过程中,char类型字符先查询编码表,得到97,再和1求和,结果为98.char类型提升为int类型。char类型内存为2个字节,int类型内存为4个字节。
char 类型也可以存储转义字符
转义符

布尔类型

java中还需要一种用于逻辑判断的类型,结果为true/false,称为布尔值,用boolean表示。
boolean占用一个二进制位。

数据类型转换

Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将会发生类型的转换。

自动类型转换

一个int类型变量和一个byte类型变量进行加法运算,结果会是什么数据类型?

int i = 1;
byte b = 2;

运算结果,变量的类型将是int类型,这就是出现了数据类型的自动转换现象。
[1] 取值范围小的数据类型自动转化成取值范围大的数据类型
[2] 类型相兼容(数值型(整形和浮点型相兼容)、整形和char类型相兼容)

public static void main(String[] args){
	int i = 1;
	byte b =2;
	// byte x = b + i; //报错
	//int 类型和 byte 类型运算,结果还是int 类型
	int j = b + i;
	System.out.println(j);
}

转换原理图解
byte类型内存占有1个字节,在和int类型运算是会提升为int类型,自动补充3个字节,因此计算后的结果还是int类型。
在这里插入图片描述
同样道理,当一个int类型变量和一个double变量运算时,int类型将会自动提升为double类型进行运算。

public class Dome16{
	public static void main(String[] args){
		
		// 自动类型转换
		int a = 100;
		double b = a;
		System.out.println("b = " + b);
		
		// error
		boolean c = false;
		int d = c;
	}
}

在这里插入图片描述
char本质上在内存中是整形
// 整形和char类型相互兼容

char e = 'A';
int f = e;
System.out.println("f = " + f);

jvm优化

可以将整型常量直接赋值给byte, short, char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围

// jvm优化
byte g = 127;
char h = 98;
System.out.println("g = " + g);
System.out.println("h = " + h);

在这里插入图片描述 [ 未找到 ]  [ Loading... ]

表达式的自动类型转换

当多个数据类型进行运算时,也会发生自动类型转换。
在这里插入图片描述

转换规则

范围小的类型向范围大的类型提升,byteshortchar运算是直接提升为int
byte、short、char–>int–>long–>float–>double

强制类型转换

强制类型转换: 将取值范围大的数据类型强制转化成取值范围小的数据类型
比较而言,自动转换是Java自动执行的,而强制转换是需要我们自己手动执行。

语法
目标类型 变量名 = (目标类型) 被转数据值

将1.5赋值到int类型,代码修改为:

//double类型数据强制转换成int类型,直接去掉小数点
int i = (int) 1.5;

同样的道理,当一个short类型与1相加,我们知道会类型提升,但是还想给结果赋值给short类型变量,就需要强制类型转换。

public static void main(String[] args){
	//short类型变量,内存中有两个字节
	short s = 1;
	/*
		出现编译失败
		s和1做运算的时候,1是int类型,s会被提升为int类型
		s+1后的结果是int类型,将结果在赋值给short类型时会发生错误
		short内存2个字节,int类型4个字节
		必须将int强制转成short才能完成赋值
	*/
	s = s + 1; //编译失败
	s = (short)(s+1);//编译成功
}

转换原理图解
在这里插入图片描述

public class Dome17{
	public static void main(String[] args){
		
		// 强制类型转换
		// 精度丢失的强制类型转换
		float a = 10.2f;
		int b = (int)a;
		System.out.println("b = " + b);
		
		// 信息丢失的强制类型转换:开发过程要避免产生
		int c = 300;
		byte d = (byte)c;
		System.out.println("d = " + d);
		
		
		// 信息丢失的强制类型转换
		int e = 97;
		char f = (char)e;
	}
}

在这里插入图片描述 [ 未找到 ]  [ Loading... ]
在这里插入图片描述
在这里插入图片描述 [ 未找到 ]  [ Loading... ]
强烈注意:
1.浮点转换整数,直接取消小数点,可能造成数据损失精度。
2.int强制转换成short砍掉2个字节,可能造成数据丢失。
3.当将一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个完全不同的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值