基本数据类型的相互转换
在Java中,基本的数据类型转换是学习的重点之一。只有了解转换规则,才能避免转换过程中遇到的一些坑。本文先讲数据类型的转换规则。
有两种方法可以转换基类型。从小到大的转换,而不损失准确性。另一种从大到小的强制转换可能会导致精度损失和误差。
对于基本类型的转换,Java语言一共提供了七种数值类型进行相互转换。
根据现有的规则,数据类型转换分为两种情况,一种是自动转换,一种是强制转换。
转换规则(从小到大)
自动转换
可以从小尺度自动转换到大尺度,也可以称为隐式转换。根据数据类型从小到大自动转换。
对于自动转换的规则,请遵守以下两条规则:
对于需要转换的数据类型必须要是转换前的数据类型兼容转换后的数据类型。转换后的数据类型的范围必须比转换前的数据类型范围大。
代码演示:
byte byteValue = ' a// 'a' ASCII为97short shortValue = byteValue//97int int value = short value;//97 long long value = int value;//97 float float value = long value;//97 double double value = float value;//97 system . out . println(double value);//97 char char value = ' a ';int intCharValue = charValue//97 system . out . println(intCharValue);运行视图:
'
以上是逐级向上转换。所以不会有什么问题,就算逃课也是可以的。
例如:
byte byteVal = 'b';int intVal = byteVal;
或者:
int intVal2 = 100;double d = intVal2;
这个没问题。但如果在下面,就有问题了。
long longVal = 100;//这里会报错。Type mi***atch: cannot convert from long to intint intVal3 = longVal;
如果必须这样做,并且转换前的数据与较小的类型兼容,则需要使用cast。
强迫
强制转换意味着默认情况下不能执行数据类型的转换,因此需要显式的类型转换。
类型转换的格式是在变量名前加括号来写基本类型。
For***t:(要转换的基本类型)变量;
long longValWait = 100;int intConvert = (long)longValWait;
要详细了解cast,首先需要知道下图:
大字节的数据类型转换需要小字节的强制转换。并且要注意转换过程中的精度损失。
让我看一个会失去精度的代码示例:
定义一个简短的,由规则定义的规则。我们可以知道byte的取值范围是-128到127。所以当我们定义一个不在取值范围内的值时,比如例子中的128就会失去精度。让我们来看看缺失的值去了哪里。
首先你可以看到short的字节是2,也就是说占用了16位,但是字节只占用了1位,也就是8位。所以在转换过程中,short的前8位丢失了。
在类型中,最左边的位是符号位。8位的符号位是1。计算机处理二进制数时,符号位1代表负值,0代表正值。所以最后7位代表数据的值。因为负数在计算机中是以补码的形式存在的。所以需要转换成原码进行计算。即在符号位不变的情况下,将二进制数的后7位逐位反转。最后一位数字加1。
这时我们遇到了一个特殊情况,就是-128的来源。因为+0和-0是一样的。但是对于0签来说没有意义。并且会有两个原码[0000 0000]和[1000 0000]。于是就有了现在补语。
补码是解决0的符号的两个码的问题。在补码运算中,[1000 0000]是-128。然后我们得到我们的输出值-128。
我们来看看129的计算:
首先我们知道129的二进制是[1000 0001],转换成8位后,开始和结束都是负数。
那么补码[1111 1111]就是-127。
从这里我们也可以根据补码知道字节数据类型的取值范围:
[1111 1111] ~ [0111 1111]也就是-128 ~ 127。
这里总结一下原码、反码、补码的大致意思。
原码:原码是指第一位代表符号,其余位代表值,就像上面的16位[0000 000 1000 0001]。
逆:正数的逆是原码本身,负数的逆是基于原码的,其余位都是逆的。
上述值变为:[0000 0000 1000 0001]
补码:正数的补码是自身,负数的补码是基于原码。其余数字反转,最后一位数字为+1。也就是在逆码的基础上+1。
的最后补码变成:[0000 0000 1000 0001],也就是129。
从这里也可以看出,我们在处理数据的时候尽量不要把大位数的数据类型转换成小位数的,除非你很清楚这种方式没有问题。
浮点类型的转换
以上都是整数的强制转换,浮点的也可以转换。这里有两个演示。
这就是引入浮点和整数进行转换或运算时的问题。对于金融来说,float和double很少用于运算和使用。建议使用BigDeci***l对象。具体为什么。原理见IEEE 754标准。以后有时间再写详细原因。主要区别是二进制位的运算。
数据转换就说到这里吧。关注我。后续更多的是基础到实战的内容。它很慢,但从不停止。
本文来自女人u加油投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/639561.html