1. 概念和理解
基本数据类型是CPU可以直接进行运算的类型。Java定义了以下几种基本数据类型:
- 整数类型:byte,short,int,long
- 浮点数类型:float,double
- 字符类型:char
- 布尔类型:boolean
我认为类型最主要的任务是表示不同的长度,存储方式和人的认识观念,比如整型的存储方式就是符号位+数值部分。浮点数就是符号位+指数位+数值部分。由于存储方式都不同,所以就不能按同一类型处理,至于弱类型语言,比如说 javascript ,存储的方式都是统一的,统一使用的浮点数的方式进行存储。还有就是长度(一个字节八位 0000 0000):
- byte 一个字节;
- short 二个字节;
- int 四个字节;
- long 八个字节;
- float 四个字节;
- double 八个字节;
- char 二个字节;
- boolean 四个字节,参考这篇: 你知道Java语言布尔(boolean)型数据到底占多大空间吗?;
对于第三点人的传统观念,在这里就是 boolean ,在 C语言 中并没有这个类型,因为我们完全可以通过 int 类型代替,比如使用 0 代表 false , 1 代表 true。
特别说明 char 类型,我们都知道 char 转换成整型有对应数值,具体参考:ASCII对照表。所以说理解 char 并不能按一般数值理解,而是按照 ASCII码 的方式理解。
2. 基本操作
// byte
byte a = 10;
byte b = 20;
System.out.println(a + b);// 30
System.out.println(a - b);// -10
System.out.println(a * b);// 200
System.out.println(a / b);// 0
我们看到 200 已经超过了 byte 的最大数值,那么为啥能正常显示,在 java 中会自动向上转型,也就是如果我是用 int 接收 byte 那么就会自动转型。能自动转换的为:byte->short->int->long->float->double。但自动转并不代表就很安全,比如我从 long->float 、 int->float 和 long->double。看下面的结果:
long d = Long.MAX_VALUE;
float c = d;
System.out.println(d);// 9223372036854775807
System.out.println(c);// 9.223372E18
很明显是不准确的,即便是转换到 double 也是不准确的。
long d = Long.MAX_VALUE;
double c = d;
System.out.println(d);// 9223372036854775807
System.out.println(c);// 9.223372036854776E18
至于原因,只要知道两者的存储方式不同就可以得知。
java 对应的还有类型的包装类:
- byte -> Byte
- short -> Short
- int -> Integer
- float -> Float
- double -> Double
- long -> Long
反正就是在基础类型的基础上将第一个字母大写就 OK 了(除了int)。 通过包装类我们可以在操作数据的时候更方便。比如说获取对应的最大值和最小值等。
// Long.MAX_VALUE 最大值
// Long.MIN_VALUE 最小值
// Long.SIZE 所占位数,这里输出的是 64
其余类似。
类型的强制转换,所谓强制也就是从所占空间大的到空间小的,从浮点型到整型,比如: long->byte、float->long 等。写这样的代码,编译器会报错,因为这是很危险的,相当于编写了潜在的 bug 。但有时候就是有这样的需求,这个时候就需要强制类型转换了。
long d = Long.MAX_VALUE;
byte c = (byte) d;
System.out.println(d);// 9223372036854775807
System.out.println(c);// -1
这里的类型除了不能转换成 boolean ,其余的都可以相互转。至于 char 转其他类型(不包含 boolean和byte),这里属于自动转,不用考虑,肯定能转成功,而且不会丢失数据,唯一需要注意的是转换以后不再是原来的数字,而是字符所对应的 ASCII码 表,比如 1 对应的数是 49。
其余的看: