数据类型强转--Java
1、首先是Java语句中的数据类型
首先是:byte:因为在计算机中是以字节bit储存的,bit包含数据0和1(详情可以了解计算机发展史)。我们一个byte是Java中最小的一个类型。然后byte叫做一个字节,一个字节包含8个字符(bit),但是由于第一位的字符0和1是属于符号位,用来判断正负值,因此转换的最大二进制就是负的2的7次方,2的7次方-1,也就是[-128,127]。
对于以上范围的疑问:为什么是-128,而不是-127,因为补码原则:补码原则是负的在其反码的基础加1,正数不变。
参考以下:
因为第一位是符号位,所以二进制就只有7位,如以下:
(0)111 1111=2的6次方+2的5次方+2的4次方+2的三次方+2的二次方+2的一次方+2的0次方=127;
-{(0)111 1111}=【(1)000 000(1 - 1)】=-{(2的6次方+2的5次方+2的4次方+2的3次方+2的2次方+2的1次方)+2的0次方}=-128
然后是short:你可以把它看成可以储存2个字节,也就是负的2的15次方到2的15次方-1,也就是[-32768,32767]
然后是int,看成两个short,就是负的2的32,2的32次-1,值域范围[-2146147483648,2146147483647]
其次是long,看成两个int,同理可得值域[-9223372036854775808,9223372036854775807]
然后有float,单精度浮点数,同上看成两个long,不过-2^128 ~ +2^128(-1)打括号是因为几乎可以忽略不计
最后是double,双精度浮点数,同上,两个float范围-2^256 ~ +2^256(-1)
然后就是其他类型,如:char:字符型,值域范围为所有字符,例如英文字母,汉字等等
Boolean:逻辑型,只包含逻辑值0和1就是(true)和(false)
通过以上我们可以简单排序:byte,short,int,long,float和double
2、为什么要强转:
因为我们在做运算时可能需要的值域范围超过原来的值域,或者为了让计算机计算时更加迅速快捷,节约资源,减少成本
3、Java中强转公式:
case 1:由小值域到大值域:
这个最简单,整型由小到大就不可能超限(超出值域范围);
例子如下:
public class yanshi{
public static void main(String[] args){
byte byteValue=127;
int intValue=0;
intValue = byteValue;//直接赋值转换
}
}
为了方遍以下我直接写函数体,就是body部分
case 2:隐式转换
条件:任一浮点数,例如1.1
BODY体
float floatValue = 1.1;//这是错误的
原因:因为1.1是属于double型的浮点数,所以不能直接赋值,这里涉及到的是隐式转换
应该改为:
float floatValue=1.1f;//这里的f告诉了编译器这是float数,而不是默认的double
case 3:浮点数由小值域到大值域
BODY体
float floatValue=1.1f;
double doubleValue=0;
doubleValue=floatValue;//这是错误的
原因:因为在计算机中浮点数是不确定的,等于是一个随机数,只能是近似的和目标值相近,这里的body体不能达到无损转换,如要了解详情可以看一下数据储存原理,这里可以稍微提一下:转换为二进制时会有精度丢失,再转换为十进制同样会有精度丢失,毕竟计算机只能按照0,1储存
应该改为:
float floatValue = 1.1f;
BigDecimal zhuanhuan = new BigDecimal(String.valueOf(floatValue));//java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算(引用于百度百科),在这里我们把floatValue先变成一个字符串进行保存计算,并对zhuanhuan实例化
double doubleValue= zhuanhuan .doubleValue();
或者
float floatValue = 1.2f;
double doubleValue = Double.parseDouble(String.valueOf(floatValue)) ;
//用了parse函数,转换为字符串再转回来
case 4:整型数由大值域转换成小值域
BODY体
int intValue = 1;
long longValue=2;
intValue=(int)longValue;//这一步是转换
整数型大值域转换成小值域的格式是:
目标格式变量=(目标格式)转换变量;
case5:浮点数由大值域转换成小值域
BODY体
double doubleValue = 1.1;
float doubleValue = Float.parseFloat(String.valueOf(doubleValue)) ;
同理;
原因:有人或许会奇怪公式都一样,哪里有强转,但实际上仔细研究下列公式可以发现原因
公式:
目标值+强转变量=目标值大写关键字.parse目标值大写关键字(String.valueOf(强转目标);
我们可以看见,Java先将其变为了一个数字形式的String的字符串,然后再转变回来