Java中的类型转换机制

摘要:本文会介绍关于java中基本数据类型以及函数传递时所涉及的类型转换

基本数据类型:

        转化规则:

        基本数据类型包括:byte(1),short(2) ,char(2),int(4),long(8),float(4),double(8),boolean(1);

在java中类型转化的基本原则是:小范围的类型向大范围的的类型转化的时候,系统会自动完成,而大范围向小范围转化时,需要加强转符。

byte b=5;
int a=10;
a=b;
b=(byte)a;

        java中以byte、char、short-->int-->long-->float-->double这个顺序的转化可以自动完成,不需要加强转符。值得一提的是:

虽然float为4个字节,long为8个字节,但是由于float为浮点型他在计算机底层符合IEEE754标准的情况下的表示方式为(数符(1位),阶码(8位),尾数(23位)),而对于long的表示方式为(符号位(1位),数值位(63)),因此float的表示范围要比long大的多,但long更为精准,所以当long向float转化时虽然会丢失精度,但仍然是从小范围向大范围进行的转化,所以该类型转化可以被自动完成。

byte b=5;
char c='a';//也可以通过char c=97:就是通过unicode值来给char赋值,会自动转化为字符。
short s=10;
int i=10;
i=b;
i=c;	//会自动转化为unicode值
i=s;
long l=100L;
l=i;
float f=3.14f;
f=l;
double d=3.141;
d=f;

        注意:

        1.在没有浮点型参与的运算中,最终的运算结果会被自动转化为int类型,因此如果接收的变量的类型为byte,short,char,就需要添加强转符。在有小数参与的运算中,最终的运算结果会被自动转化为double类型,因为如果没有声明小数是什么类型,java中会默认为double类型,因此接收的变量类型如果不是double类型,就需要添加强转符。

byte b=5;
char c='a';
short s=10;
long l;
b=(byte)(c+s);
System.out.println(b);	//107:char类型会转化为unicode类型在进行运算
l=c+s;	//因为最终结果为int类型,所以可以直接用long类型接收
float f=3.14f;
f=(float) (1.0*b/s);	//因为小数参与的最终为double类型,因此需要添加强转符。
f=f/b;	//这个不需要强转,是因为这里面参与运算的小数被声明为float类型了
f=(float)(1/2); //这里的f为0.0,因为1/2会被先强转为int类型,才会被强转为float。
System.out.println(f);

        2.如果用常量赋值,对于整型(byte,short,int,long)和字符型(char),虚拟机会判断常量值是否在int的范围内,如果在的话,就会判断这个常量值是否在要赋值的类型的范围内,如果在就直接赋值,不需要强转。浮点型没有这个特性。

byte b=10+1;
b=(byte)(10+127);	//这个不能直接赋值是因为结果超出了byte类型
short s=20+20;
long l=20;
l=10000000000l;	//这个需要在后面在l声明这个是long类型的数据,是因为这个常量超出了int的表示围。
s=(short)(b+10);	//这个需要强转符是因为他又变量参与,并不是彻底的常量运算。
float f=(float)(1.0+1.0);	//浮点型不遵循这个原则

3.如果直接用二进制(0b),八进制(0),十六进制(0x)进行赋值,虚拟机会将这些数据默认作为补码来解析,而十进制的赋值会作为原码进行解析。

byte b=(byte)0x80;
System.out.println(b); //b的值为-128,因为0x80是作为补码赋值给b。
b=(byte) 0b10000001;
System.out.println(b);//-127
b=(byte)0200;
System.out.println(b);//-128

4.对于函数传递,形参如果作为大范围类型而实参作为小范围类型,虚拟机会自动对其进行强转,反之则需要强转符,对于返回值来说也是如此。

public static void main(String[] args) {
	double d=add(1,(byte)1);
}
public static int add(double d,byte a){
	return (int)(a+d);
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值