欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据类型转换

程序员文章站 2022-03-18 09:35:07
...

一.Java中的八种基本数据类

1.整数:byte、short、int、long
2.小数:float、double
3.字符:char
4.布尔:boolean

注意:字符串的类型String不是基本数据类型,而是引用数据类型。单引号引起的是字符,双引号引起的是字符串,如果双引号中没有内容是属于一个空的字符串。

二.声明变量的方式

1.方式一:数据类型 变量名=数据;
2.方式二:数据类型 变量名1,变量名2,……;

三.数据类型转换

(一).数据类型转换的方式(2种)

1.自动类型转换(也叫隐式类型转换):小数据类型——————>大数据类型

class demo1{
	public static void main(String[] args){
		byte b = 11;
		short s = b;
		int i = s;
		long l = i;
		System.out.println(l);
	}
}

数据类型转换













注解:byte是1个字节,占8位;short是2个字节,占16位;依次类推,int是4个字节,long是8个字节。

          可以形象地理解为byte是一个可以装下一两水的碗,short是一个可以装下二两水的碗;把b变量存储的值赋予给s变量后,之前一两的碗             能装下的数据换一个二两的碗依然能装下这么多数据。

2.强制类型转换(也叫显式类型转换):大数据类型——————>小数据类型

class demo2{
	public static void main(String[] args){
		int i = 128;
		byte b = i;
		System.out.println(b);
	}
}

运行结果如下图所示

数据类型转换

注解:我们发现此程序在编译时就会报错,可能会损失精度。那是因为int数据类型占了4个字节,而byte数据类型只占了1个字节,不可以将一个数值赋给一个比它的数值范围更小的一个变量,除非进行类型转换。就好比把大容器中装的水往小容器倒一样,小容器就会出现溢出。正确的做法是要进行强制类型转换,如下:

class demo2{
	public static void main(String[] args){
		int i = 128;
		byte b = (byte)i;
		System.out.println(b);
	}
}

运行结果如下图所示:
数据类型转换








强制类型转换的工作原理:强制类型转换在内存中实际上相当于把i的低8位全部取到byte中,如果前面还有数据就不要了。但是此时还有一个疑问,byte数据类型占一个字节,那么理所应当它最大能装到127,但是结果是-128并不是127,这时候就要清楚负数在计算机中是如何存储的。

(二).负数的存储原理

1.负数的存储原理图

数据类型转换

所以,如果是负数,那么最高位肯定是1,正数的二进制数的最高位是0。当然,sun也给我们提供了一个功能Integer.tobinaryString()可以查看一个数据的二进制形式。

class demo3{
	public static void main(String[] args){
		System.out.println(Integer.toBinaryString(-7));
	}
}

运行结果如下图所示:
数据类型转换

2.-128的由来

数据类型转换

(三).强制类型转换注意细节:

1.凡是byte、short、char数据类型的数据在运算的时候都会自动转换成int类型的数据再进行运算。

例1:如果不强制类型转换就会在编译时报错

(1)错误的程序以及运行结果

class demo4{
	public static void main(String[] args){
		byte b1 = 1;
		byte b2 = 2;
		byte b3 = b1+b2;
		System.out.println(b3);
	}
}

数据类型转换

(2)强制转换后的程序以及运行结果

class demo4{
	public static void main(String[] args){
		byte b1 = 1;
		byte b2 = 2;
		byte b3 = (byte)(b1+b2);
		System.out.println(b3);
	}
}

数据类型转换

例2.

class demo5{
	public static void main(String[] args){
		System.out.println('a'+1);
	}
}

数据类型转换

2.两个不同数据类型的数据在运算的时候,结果取决于大的数据类型
例2

class demo6{
	public static void main(String[] args){
		int i = 10;
		long l = 20;
		i = (int)(i+1);   //结果是int类型,用int类型接收需要强制类型转换
		System.out.println(i);
	}
}

数据类型转换

例3 为什么demo7不会报错而demo8却会报错?
(1)demo7的程序和运行结果

class demo7{
	public static void main(String[] args){
		byte b = 10;
		System.out.println(b);
	}
}

数据类型转换

(2)demo8的程序以及运行结果

class demo8{
	public static void main(String[] srgs){
		int i = 10;
		byte b = i;
		System.out.println(b);
	}
}

数据类型转换

注解:
(1)在demo7中确实不会报错,一个整数没有加任何标识的时候默认是int类型的数据,大类型的数据往小类型的数据转换理论上是会报错的,但是10是一个常量,编译器在编译的时候就能够确认常量的值了,在编译到byte b = 10;的时候,java编译器就会检测到10并没有超出byte的表示范围,所以允许赋值。

(2)在demo8中一定会报错,java编译器在编译到第一句int i = 10;的时候,会检查到10这个常量并没有超出int的表示范围,但是并没有把这个值赋予给变量i,只有在执行java命令时,变量才会在内存中分配空间,才可以存储数据。而在编译第二句byte b = i;的时候,对于java编译器来说,在编译的时候i并没有存储值,只能检查出i是一个int型的变量,int类型的变量就有可能会超出byte类型的表示范围,所以此时会报错。