数据类型转换(java)
- 默认转换(从小到大 /*联想式理解:从弱变强 因为代码的世界是正能量的,所以可以默许蜕变得原来越好哇*/)
byte(1),short(2),char -> int(4) -> long(8) ->float(4) -> double(8)
问题来了,4个字节的float存8个字节的long???
这里就有个小知识点啦:
- 浮点型采用科学计数法,整型采用补码形式,两者的存储结构不同,所以直接比较是不对的哦。方法展开见下详述(选读即可):
float类型数字在计算机中的存储遵循IEEE—754格式标准:一个浮点数由底数m和指数e两部分组成。
①底数部分:使用二进制数来表示浮点数的实际值
而指数可正可负,Therefore,IEEE规定,此处算出的次方必须减去127才算真正的指数。
②指数部分:占用八个字节的二进制数,可表示0~255的数值范围
底数部分实际是占用24字节的一个值,但是最高位始终为1,因而最高位省去不存储,在存储中占23字节
格式:
SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
PS:其中S表示浮点数正负
E指数 加上 127后的 值 的 二进制数据
M底数
eg:10.625在内存中的存储
首先要把10.625换算成二进制:1010.101
①整数部分:二进制
②指数部分:乘以2,直到乘位0,进位按顺序取
- 从第一点的知识基础上,我们可以明确float表示的数据范围比long的范围要大
- ①boolean类型不能转换为其他的数据类型
②byte,short,char相互之间不转换,如果他们参与运算呀,就先转换为int
- 字符串类型与其他类型进行字符串连接+时,结果是字符串类型
进行运算时,讲究个“先入为主”
eg:
System.out.println("aha"+'a'+1);
System.out.println(1+'a'+"aha");
System.out.println(5+5+"=5+5");
System.out.println("5+5="+5+5);
- 数据溢出的情况下 进行强制类型转换
知识补充:原码补码反码之间的三角关系
原码:对应数字的二进制
反码:原码中的1变0,0变1,搞定
补码:反码末尾加一
eg:(byte)129 ==?
①计算机中通过数据补码形式进行运算
②明确:byte只占一个字节,8位
而int占四个字节,32位
③整形129的补码(当然啦,作为正数,原码补码反码都是一样的): 00000000 00000000 00000000 10000001
做截取操作,截成byte类型,保留八位:10000001
那么再通过已知补码还原出原码就是下一步的工作咯
反码(把那个1再减回来):10000000
原码(1变0,0变1):01111111
其中,0位符号位(符号位上0代表负号,1代表正号)
1+2+4+8+16+32+64=127
锵锵锵,所以(byte)129为-127
因为byte的范围是-128~127,,所以大家完全可以找个范围外的数练练手,小陌当了多年的理论党越来越菜,往往熟习理论只是真正学会的十分之三,会用才是王道,别堕落为小陌这般菜鸟呀!!!
!!!不要随意的去使用强制转换,毕竟它隐含了精度损失的弊端