数据类型分类:
A:基本数据类型
B:引用数据类型(类,接口,数值)
基本数据类型:4类8种
A:整数 占用字节数
byte 1
short 2
int 4
long 8
B:浮点数
float 4
double 8
C:字符
char 2
D:布尔类型
boolean 1
注意:
整数默认是int类型
浮点数默认是double类型。
长整型后缀用L或者l标记。建议使用L。
单精度浮点数用F或者f标记。建议使用F。
byte,short在定义的时候,他们接收的其实是一个int类型的值。
这个是自己做了一个数据检测的,如果不再他们的范围内,就报错。
例子:
class DataTypeDemo {
public static void main(String[] args) {
//定义变量的格式:
//数据类型 变量名 = 初始化值;
//定义一个字节变量
byte b = 10;
System.out.println(10);
System.out.println(b);
//定义一个短整型变量
short s = 100;
System.out.println(s);
//定义一个整型变量
int i = 1000;
System.out.println(i);
如果 是 int i = 100000000 这是超过了int的范围;
//定义long时 (在最后加L)
long j = 100000000L;
System.out.println(j);
//定义浮点数据变量
float f = 12.345F;
System.out.println(f);
double d = 12.345;
System.out.println(d);
//定义字符型变量
char ch = 'a';
System.out.println(ch);
//定义布尔类型变量
boolean flag = true;
System.out.println(flag);
}
}
一般来说,我们在运算的时候,要求参与运算的数据类型必须一致。
boolean类型不能转换为其他的数据类型。
默认转换(从小到大的转换):
A:byte,short,char-int-long-float-double
B:byte,short,char,相互之间不转换,他们参与运算首先转换为int类型。
有一个问题:为什么long 8个字节会在float前面?
答:A:他们底层的储存结构不同。
B:float表示的数据范围比long的范围要大。
下面是一个加法运算在计算机内部进行的情况例子:
byte a = 3;
int b =4;
byte c = a+b;//有问题 错的
int d = a+b;//没有问题 对的
首先计算出数据对应的二进制(因为在计算机内部都是01);
十进制的3对应二进制的11;
十进制的4对应二进制的100;
a+b=c在计算机内部是这个样子:
byte c = 3; 00000011(计算机储存的样子)
int b = 4;00000000 00000000 00000000 00000100(计算机内部储存的样子)
但是 由于默认转换 小类型(byte,short,char,)自动转换为大类型变为int类型
所以 00000011会变成00000000 00000000 00000000 00000011
最后做加法 结果是00000000 00000000 00000000 00000111
强制类型转换:
从大的数据类型到小的数据类型。
格式:
目标数据类型 变量 = (目标数据类型) (被转换的数据)
注意:
不要随意的使用强制类型转换,因为它隐含了精度损失问题。
思考题1:请问下面这个有没有问题
double d = 12.345;
float f = d;
思考题2:看看下面两个定义有没有区别?
float f1 = (float) 12.345;
float f2 = 12.345f;
f1其实是通过一个double类型转换过来的。
而f2本身就是一个float类型。
面试题:
byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
哪句是编译失败的呢?为什么呢?
答:b = b1+b2;是有问题的。
因为变量相加,会首先看类型问题,最终把结果赋值的也会考虑类型问题。
意思就是b1这个byte类型和b2这个byte类型相加的时候会变成int类型所以将后面变为byte类型 即b=(byte)(b1+b2);
常量相加,首先做加法,然后看结果是否在赋值的数据类型范围内,不过不是,才会报错。
面试题2:
byte b = 130;有没有问题?如果想让赋值正确,可以怎么做?结果是多少?
答:因为byte的范围是:-128到127。因为130不在这个范围之内,所以报错。
我们可以进行强制转换:byte b = (byte) 130;
System.out.println(b);
答案是多少呢?
我们想要知道结果是什么,就应该知道是如何进行计算的。
而我们又知道计算机中数据的运算都是补码进行的。
而要得到补码,首先要计算出数据的二进制。
A:获取130这个数据的二进制
00000000 00000000 00000000 10000010
这是130的原码,也是反码,还是补码(因为130是正数)。
B:做截取操作,截成byte类型的了。
10000010
这个结果是补码。
C:已知补码求原码():
符号位 数值位
补码 1 0000010
反码 1 0000001
原码 1 1111110
1111111表示byte范围(-128到127)中的127所以数值位1111110表示的数是126,又因为符 号位是1所以是-126,则答案输出结果是-126。