前言
Java有八种基本数据类型,分别是4种整形、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char和1种用于表示真值的boolean类型。(String不是基本数据类型)
一、整形
整形用于表示没有小数部分的数值,可以是负数。Java提供了4种整形,它们的具体内容如下:
一般情况下int类型是最常用的。
在Java种,整形的范围与运行Java代码的机器无关,这就解决了软件从一个平台移植到另一个平台或者同一个平台中不同操作系统之间进行程序移植所带来的问题。Java程序必须保证在所有机器上都能够得到相同的运行结果,因此各种数据类型的取值范围都是固定的。
长整型数值有一个后缀L或l(小写的L,如400000000000l)。十六进制数值有一个前缀0x或0X。八进制有一个前缀0,如010则对那个八进制中的8(八进制表示容易混淆,因此不要常用八进制表示)。
从Java7开始,加上0b或者0B就可以表示二进制数了。
同样从Java7开始,还可以为数字字面量加下划线,如用1_000_000表示一百万(其他进制也可以这样表示,Java编译器会去除这些下划线)。
最后注意,Java没有任何无符号(unsigned)形式的int、long、short或byte类型。也就是说这四种整数类型都是有符号的(可以同时表示负数和正数)。
相关代码如下:
1. long l = 400000000000l;//长整型整数
2. int hexNum = 0xCAFE;//十六进制整数表示,也就是十进制的51966
3. int octNum = 010;//八进制整数表示,也就是十进制的8
4. int bin = 0b1001;//二进制整数表示,也就是十进制的9
5. int num = 1_000_000;//十进制数1000000
二、浮点类型
浮点类型用于表示有小数部分的数值。Java有两种浮点类型:
从上表可以看出,double表示的数值精度是float类型的两倍,因此有人称double为双精度数值。在通常情况下,我们都是在程序中使用double类型,因为float类型的精度在很多情况下都是难以满足需求的。
Float类型的数值有一个F或者f后缀,没有F或f后缀的浮点数值默认为double类型,或者在数值后面添加后缀D或者d。
另外,十六进制也可以表示浮点数,具体看相关代码(涉及到计算机组成原理,不展开讲了,可以记住表示形式就可以了):
1. //可以使用十六进制表示浮点数
2. //表示形式为0x尾数*基数*指数
3. //如0.125=2^(-3),0.25=2^(-2);
4. //对应的十六进制表示分别为0x1.0p-3,0x1.0p-2;
5. //比如0x1.0p-3,0x表示十六进制表示,1.0表示尾数(尾数也是采用十六进制表示),基数p=2而不是10,指数-3采用十进制表示
6. double hexDou = 0x1.0p-3;//十六进制表示,相当于十进制0.125
7. double hexDou2 = 0x1.0p-2;//表示十进制0.25
所有的浮点数的计算都是遵循IEEE754规范(计算机组成原理相关)。
在浮点数中,有三个特殊的浮点数值:
8. 正无穷大
9. 负无穷大
10. NaN(不是一个数字)
相关代码及其解释:
12. /**
13. * 浮点数有三个特殊的常量:Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY、Double.NaN
14. * 分别表示正无穷,负无穷和判断浮点数是否为一个数值(Float也有对应的三个常量数值)
15. */
16. //注意:除数为整数0会报错,除数为浮点数0.0则不会报错
17. System.out.println(Double.POSITIVE_INFINITY);//等于1/0.0,正无穷(infinity)
18. System.out.println(1/0.0);//输出infinity(正无穷),不会报错
19. System.out.println(Double.NEGATIVE_INFINITY);//等于-1/0.0,负无穷(-infinity)
20. System.out.println(-1/0.0);//输出-infinity(负无穷),不会报错
21. System.out.println(1/0);//注意会报错,除以整数0会报错
22. /**
23. * isNaN(x)方法用于判断x是不是一个数值,为true说明不是一个数值,为false表示x是一个数字
24. * 通常不能够直接用x == Double.NaN去判断是否为一个数值,这样结果永远为false
25. * 只有通过isNaN(x)才可以判断x是否为一个数值
26. */
27. System.out.println(1/0.0);//无穷大是一个数字,输出为true
28. System.out.println(Double.isNaN(0.0/0.0));//无穷小乘以无穷大,结果不是一个有意义的数字,输出false
注意:浮点数值不适用于无法接受舍入误差的金融计算中。例如,命令System.out.println(2.0-1.1)将打印出0.8999999999999999, 而不是人们想象的0.9。这种舍入误差的主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确地表示分数 1/10。这就好像十进制无法精确地表示分数1/3 —样。如果在数值计算中不允许有任何舍入误差, 就应该使用BigDecimal类,
三、char类型
char类型一般用于表示单个字符,其表示的字面量要用单引号括起来。如:
1. char c = 'A';//表示字符A
2. //char c1 = "A";//这是错误的写法,双引号括起来的是字符串类型(String)
3. char c2 = '\u0000';//char类型的值也可以表示十六进制值,表示范围从 \u0000 到 \Uffff。表示的字符可以查表
注意:转义序列的转义在解析代码之前就会进行处理,因此在编码过程中,如果没有注意这个特点会出现意想不到的结果:
1. //转义序列在解析代码之前就进行,需要注意编码和注释中的转义序列
2. System.out.println("\u0022+\u0022");
3. /**
4. * 实际上,\u0022会在解析之前转换为 ",这会得到也就是一个空串,
5. * 因此输出不是一串字符,而是空串,因为转义在解析代码之前就已经进行了
6. */
7. //同时还要注意注释中的代码.注释中的转义字符不是合法的转义也是会报错的
8. // Look inside c:\users 这一行注释会报错!!!
报错信息:
四、boolean类型
boolean (布尔)类型有两个值:false和true, 用来判定逻辑条件整型值和布尔值之间不能进行相互转换。