从零开始学java--day02--数据类型转换

小白学java–day02–数据类型转换


一、数据类型转换

类型转换:数据类型之间的转换

分类:
	基本类型间的转换
	引用类型间的转换
	基本类型和包装类型间的转换(暂没学习)
	基本类型和字符串类型间的转换(暂没学习)

基本类型间的转换
	基本类型可以根据"取值范围"进行对应的转换

基本类型间转换的分类:
	自动转换(隐式转换)
	强制转换(显式转换)

1.基本类型间的转换

基本类型间的自动转换(隐式转换)
	将取值范围较小的数据类型转换成取值范围较大的数据类型

基本类型取值范围从小到大的关系:
	byte < short < int < long < float < double
			char < int < long < float < double

代码如下:

		long num01 = 123L;
		float num02 = 12.34F;

		//将long类型变量num01的值123L赋值给float类型变量num02
		num02 = num01;
		//将float类型变量num02的值12.34F赋值给long类型变量num01
		//num01 = num02;//错误: 不兼容的类型: 从float转换到long可能会有损失

		System.out.println("============================");

		char num03 = 'a';
		int num04 = 123;

		//num03 = num04;//错误: 不兼容的类型: 从int转换到char可能会有损失
		num04 = num03;

		System.out.println("============================");

		char num05 = 'a';
		short num06 = 123;

		//num05 = num06;//错误:不兼容的类型: 从short转换到char可能会有损失
		//num06 = num05;//错误:不兼容的类型: 从char转换到short可能会有损失

2.基本类型间的强制转换

基本类型间的强制转换(显式转换)
	将取值范围较大的数据类型转换成取值范围较小的数据类型
格式:
	取值范围较小的数据类型 变量名 = (取值范围较小的数据类型)取值范围较大的数据类型的数据值;

代码如下:

		//声明并初始化double类型变量
		double d = 3.99;

		//进行强制类型转换
		int num = (int)d;

		System.out.println(num);

3.基本类型转换的注意事项:

1.基本类型转换是七种数值类型间的转换,boolean类型变量无法进行转换
2.在实际应用中尽量避免使用强制类型转换,可能发生数据的损失和数据的溢出
3.基本类型中有三个特殊类型byte,short,char,这三种数据类型只要参与数学运算,会将这三种类型的变量提升成int类型变量,再参与数学运算;
如果没有数学运算操作,该三种数据类型依然遵循基本类型的自动转换和强制转换规则

代码如下:

		byte num = (byte)130;
		System.out.println(num);

		System.out.println("=======================");

		float f1 = 1.1F;
		float f2 = 3.4F;

		float f3 = f1 + f2;
		System.out.println(f3);

		byte b1 = 3;
		byte b2 = 4;
		byte b3 = (byte)(b1 + b2);
		System.out.println(b3);

		short var01 = 3;
		byte var02 = 4;

		//自动转换
		var01 = var02;
		//强制转换
		var02 = (byte)var01;

4.常量

常量:在程序中其值不可以发生改变的量
分类:
	字面值常量:就是单独的一个值,没有实际意义,需要结合代码有意义
		整数字面值常量
		浮点字面值常量
		布尔字面值常量
		字符字面值常量
		字符串字面值常量
		空常量(暂没学习)
	自定义常量(暂没学习)

代码如下:

		//打印字面值常量
		System.out.println(123);
		System.out.println(3.14);
		System.out.println(true);
		System.out.println('a');
		System.out.println("HelloWorld");
常量的注意事项(常量优化机制)
	1.当声明初始化byte,short,char类型变量时,当右面的初始化值是字面值常
	量,且该字面值常量还在其数据类型的取值范围内,JVM自动会在编译时期自
	动将这个字面值常量优化为该数据类型,我们将这一过程称之为"常量优化机制"
	2.当进行数学运算的时候,运算符号两边都是字面值常量,且运算后的结果还在
	其数据类型的取值范围内,JVM自动会在编译时期自动将该运算运算完毕,我们
	将这一过程也称之为"常量优化机制"

代码如下:

		//int i = 123;
		byte b = 123;
		System.out.println(b);

		System.out.println("=====================");

		byte b1 = 3;
		byte b2 = 4;
		//byte b3 = b1 + b2;
		byte b3 = 3 + 4;// byte b3 = 7;

二、运算符

运算符:在程序中用来连接变量或常量的运算符号
表达式:在程序中用运算符连接起来的式子
	举例: a + b

运算符的分类
	算数运算符
	赋值运算符
	关系运算符
	逻辑运算符
	三元运算符
	位运算符

1.算数运算符

算数运算符:在程序中针对常量或变量进行数学运算的运算符
包含:
	+ - * / % ++ --
/ 和 % 的区别:
	/ : 获取两个数相除的商
	% : 获取两个数相除的余数

代码如下:

		int a = 3;
		int b = 4;

		//进行四则运算和取余运算
		System.out.println(a + b);
		System.out.println(a - b);
		System.out.println(a * b);
		System.out.println(a / b);
		System.out.println(a % b);
(1) + 号的多种用法:
	1.加法运算符
	2.字符串连接符
	当+号两边中的任意一边出现字符串的话,+号不再起到加法运算的操作,而是进行字符串的连接,将两边的内容直接进行合并,获取到新的字符串
	
(2)自增自减运算符:
	++:在变量自身数据值的基础上进行+1运算操作,再将结果赋值给该变量
	--:在变量自身数据值的基础上进行-1运算操作,再将结果赋值给该变量
格式:(以++为例)
	变量名++
	++变量名
特点:
	1.单独使用
		++在前和++在后的结果是一样的
	2.复合使用
		++在前,先自增,后使用
		++在后,先使用,后自增

2.赋值运算符

赋值运算符:针对变量进行赋值运算的运算符

分类:
	基本赋值运算符:=
	扩展赋值运算符:+= -= *= /= %=
		含义:进行扩展赋值运算符的运算时,将运算符两边的变量进行运算操作
		(是什么运算,取决于除了=另外的符号),将运算后的结果再赋值给左边的变量

代码如下(示例):

		//将整数3赋值给int类型变量num
		int num = 3;

		int a = 3;
		int b = 4;

		//a += b; // 相当于 a = a + b
		a *= b;
		System.out.println("a = " + a);
		System.out.println("b = " + b);
赋值运算符的注意事项:
	1.扩展的赋值运算符,将运算后的结果赋值给左边的变量之前,会根据左边变量的数据类型隐式进行强制类型转换
	2.进行扩展赋值运算符运算的时候,如果右边是一个式子的,需要先将这个式子运算完毕后,再进行扩展赋值运算符的操作

代码如下(示例):

		byte b1 = 3;
		byte b2 = 4;
		//b1 = b1 + b2;
		b1 += b2;

		int a = 5;
		int b = 8;

		a *= b - 6;
		//先减后乘,(8-6)*a=10  正确

		System.out.println("a = " + a);

3.关系运算符

关系运算符:判断变量间关系的运算符号

包含:
	> >= < <= == !=
注意事项:
	1.关系表达式的结果一定是boolean值
	2.如果是两个符号的关系运算符,必须连在一起进行编写,否则编译报错
	3.千万不要将==写成=,也不要将=写成==

==:判断两个基本类型变量的值是否相等
!=:判断两个基本类型变量的值是否不等

4.逻辑运算符

逻辑运算符:将关系表达式与关系表达式之间构成一定的逻辑关系的运算符

分类:
	基本逻辑运算符
		&	|	^	!
	短路逻辑运算符
		&&	||
基本逻辑运算符:
	& : 与,且	结论:有false则false			
	应用场景:判断多个条件是否同时满足
	| : 或		结论:有true则true
	应用场景:判断多个条件是否至少满足一个
	^ : 异或	结论:相同为false,不同为true	
	应用场景:判断多个条件是否不同
	! : 非		结论:非true则false,非false则true
	应用场景:将条件的结果进行取反

短路逻辑运算符:
	&& : 双与,短路与
	|| : 双或,短路或
& 和 && 区别:
	& 和 && 的结果是一样,&&具有短路的效果,当&&前面的表达式结果为false的时候,后面的表达式不会被执行;
	&前面的表达式的结果无论是true还是false,后面表达式都会被执行
| 和 || 区别:
	| 和 || 的结果是一样,||具有短路的效果,当||前面的表达式结果为true的时候,后面的表达式不会被执行;
	|前面的表达式的结果无论是true还是false,后面表达式都会被执行

5.三元运算符

三元运算符:含有三位未知量的运算符

格式:
	关系表达式 ? 结果值1 : 结果值2

执行流程:
	1.先看关系表达式的结果是true还是false;
	2.在确定关系表达式结果的同时,统一结果值1和结果值2的数据类型
	3.如果关系表达式的结果是true,执行结果值1;
	  如果关系表达式的结果是false,执行结果值2
//需求:获取两个数的较大值
	int a = 3;
	int b = 4;
	System.out.println(a > b ? a : b);  // 4

	System.out.println("=============================");

	int x = 3;
	double y = 4.5;

	System.out.println(true ? x : y);//true ? 3.0 : 4.5 先统一变量类型然后再参与运算

补知识点:原码,反码,补码:

(1)原码,反码,补码
	相同点:
		都是数据对应的定点二进制表示方式;
		根据数据对应的存储字节转换成二进制位进行足位,不足位,前面需要0进行补位,该二进制的最高为为符号位,0表示正数,1表示负数
	不同点:
		原码:是显式数据对应的二进制足位表示
		反码:通过反码进行原码和补码之间的转换
		补码:在计算机中一切数据的计算都拿数据的补码进行进行计算
		
(2)数据存储和运算过程:
	1.将十进制数据转换成原码二进制
	2.数据的原码转换成数据的反码
		如果数据是正整数:其反码和原码是一致的
		如果数据是负整数:其反码就是在原码的基础上进行逐位取反(符号位保持不变)
	3.数据的反码转换成数据的补码
		如果数据是正整数:其补码和反码是一致的
		如果数据是负整数:其补码就是在反码的基础上进行+1运算
	4.根据补码进行运算获取到结果的补码
	5.结果的补码转换成结果的反码
		如果结果是正整数:其反码和补码是一致的
		如果结果是负整数:其反码就是在补码的基础上进行-1运算
	6.结果的反码转换成结果的原码
		如果结果是正整数:其原码和反码是一致的
		如果结束时负整数:其原码就是在反码的基础上进行逐位取反(符号位保持不变)
	7.结果的原码转换成十进制数据
举例
将int类型的130强转为byte类型后,结果为-126

	过程分析:
		1.获取130的原码
			数据的原码:00000000 00000000 00000000 10000010
		2.根据130的原码获取其反码
			数据的反码:00000000 00000000 00000000 10000010
		3.根据130的反码获取其补码
			数据的补码:00000000 00000000 00000000 10000010
		4.int类型强转为byte类型
			结果的补码:10000010
		5.根据结果的补码获取其反码
			结果的反码:10000001
		6.根据结果的反码获取其原码
			结果的原码:11111110
		7.根据结果的原码获取其十进制数据
			十进制数据:-126

6.位运算符

位运算符:在程序中针对二进制位进行操作的运算符

分类:
	按位运算符
		&	|	^	~
	移位运算符
		<<	>>	>>>
注意事项:
	&,|,^,看运算符的两边如果是boolean值的话,它们就是"逻辑运算符";
	如果两边是数值的话,它们就是"位运算符"

按位运算符:
	&:按位与,当两位相同为1时才返回1 
	|:按位或,只要有一位为1即可返回1
	^:按位异或,当两位相同时返回0,不同时返回1(包含符号位)
	~:按位非:将操作数的每个位全部取反(包含符号位)

移位运算符:
	<<:左移运算符
		格式:数据 << 移动位数
		特点:将二进制数据往左移动指定位数,符号位也随之移动,如果低位出现了空位,以0进行补位
	>>:右移运算符:
		格式:数据 >> 移动位数
		特点:将二进制数据往右移动指定位数,符号位也随之移动,如果高位出现了空位,以和符号位相同的数字进行补位
	>>>:无符号右移运算符:
		格式:数据 >>> 移动位数
		特点:将二进制数据往右移动指定位数,符号位也随之移动,如果高位出现了空位,以0进行补位

补知识点:运算符的优先级:

1.不要把一个表达式写得过于复杂,如果一个表达式过于复杂,则把它分成几步来完成;
2.不要过多的依赖运算的优先级来控制表达式的执行顺序,尽量使用()来控制表达式的执行顺序
3.在程序中提高优先级,()可以进行嵌套

留言

本人把学习的笔记、练习、总结都写在这里,当做学java历程的记录吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jwwy*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值