java自学日记——数据类型及转换

01.Java中整形表示方法

十进制:默认,eg:int a=8;

八进制:0**, eg:int b=010;

十六进制:0x**,eg:int c=0x08;

二进制(JDK8版本以上支持):0b**,eg:int d=0b10;

02.关于类型转换

        2.1JAVA中整数类型的字面量被默认为 int , 当声明变量为long型时需要需要在后方加  l  或  L

        EG:    long b=1000L;//不存在类型转换,因为已经手动将字面量转换为long型。

	System.out.println(b);//此处不存在类型转换,1000L已经手动得将类型转换为long型

           2.2如下图所示定义,会报错!需要手动加 将字面量改为 long 

	long d=2147483648;
	"此处字面量已经大于int得最大值,而不加L默认int,所以报错"
	"错误信息:”IntTest1.java:16: 错误: 整数太大"

       2.3类型转换—— 向上转型

                                                          可以自动调整

	long c=200;
	"//200被默认为int型字面量,所以存在类型转换"
	"//int类型占4个字节,long类型占八个字节,小容量可以自动转换成大容量"
	System.out.println(c);"//所以上方不加L也可。它自己进行了类型转换。"

     2.4类型转换——向下转型

                                                需要手动调整,使用强制转换

	long i=100000L;
	"//int l=i;// 报错——不兼容的类型: 从long转换到int可能会有损失"
	int l=(int)i;
	"//long类型的i的二进制储存方式为"
	"//00000000 00000000 00000000 00000000"
	"//00000000 00000001 10000110 10100000"
	"//使用强制类型转换符号后砍掉前4个字节为:00000000 00000001 10000110 10100000"

所以在此处不存在精度损失,但当long四个字节以上不为零,强制转换会损失前四个字节的数据。

                                           强制转换弊端1: 如下图变会产生精度损失

public class IntTest2{
	public static void main(String[] args){
	byte a=(byte)300;
	"//byte最大127,会产生精度损失"
	System.out.println(a);//输出结果为44"
	"//默认int型的字面量100的存储方式为"
	"//00000000 00000000 00000001 00101100"
	"//byte为1个字节,强制转换为00101100=44"
	}
}

                                         强制转换弊端2:

/*
	1.计算机只能识别二进制
	2.计算机底层存储为二进制的补码形式
		源码 反码 补码
		(1).对于正数来说,源码、反码、补码完全一致
		int a=1;
		原:00000000 00000000 00000000 00000001
		反:00000000 00000000 00000000 00000001
		补:00000000 00000000 00000000 00000001
		(2).对于负数来说
		byte b=-1;
		对应的二进制源码:          10000001
		反码(符号不变,其余取反):11111110
		补码                      :11111111
*/
public class intTest3{
	public static void main(String[] args){

	//byte b=150;不能直接通过,大专小需要强制转换
	byte b=(byte)150;
	//分析:150默认int型,为4个字节,在计算机中以补码方式存在
	//00000000 00000000 00000000 10010110
	//强制转换后为:10010110(补码)
	//反码:10010101;源码:11101010=-106
	System.out.println(b);
	}
}

     2.5 Java语法中有一机制:当整形字面量没有超过声明类型 的取值范围那么这个整形字面量可以直接赋给所声明的类型,(个人理解,sun公司不承担精度损失的责任,需要编写者手动调整

public class IntTest2{
	public static void main(String[] args){
	byte a=(byte)300;
	"//300默认当作int型,b变量为byte型,"
	"//大容量转小无法自动转换"
	"//byte最大127,会产生精度损失"
	System.out.println(a);
	"//输出结果为44"
	"//默认int型的字面量100的存储方式为"
	"//00000000 00000000 00000001 00101100"
	"//byte为1个字节,强制转换为00101100=4"
	
	byte b=1;
	System.out.println(b);
	"//java中有一特殊机制,当整形数值小于byte最大值时可以直接赋值,不做类型转换"
	short c=1;
	System.out.println(c);

	byte d=(byte)128;
	System.out.println(d);
	}
}

另:byte\short\char混合运算时会将数据先转换为int型

public class test2{
	public static void main(String[] args){
	char b1='a';
	byte b=1;
	System.out.println(b+b1);//输出得98
	//short,long,byte做混合运算时,先转换为int型再运算

	//short s=b+b1;//此句报错,右边是int型
	short s=98;//此句不报错
	//这是因为编译器只能检测到第一句是加法运算,不知结果,只知道是int型
	//而第二句可以清楚得看到数值为多少

	//short s=(short)b+b1;编译报错,因为只把b转换为short型,b1还是int型。
	short s=(short)(b+b1);

	int a=1;
	short c=a;// 错误: 不兼容的类型: 从int转换到short可能会有损失
	short c=1;//不报错,因为编译器只能检查语法判断右方为int型,而不能判断是否数值超过short得最大值

	}
}


版权声明:本文为qq_45233518原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。