目录
Java 的基本数据类型一共有八种,可以分成四类:
1.整型:byte, short , int , long
2.浮点型:float , double
3.字符型:char
4.布尔型:boolean
整型和浮点型的字节长度和取值范围如下图:
(1个字节表示8个bit位,可以表示8位二进制数)
一、byte类型
关于byte类型有一个很特殊的问题:
127 + 1 = -128?
public static void main(String[] args) {
byte a = 127;
byte b = (byte)(a+1);
System.out.println(b);
}
这是计算机计算加法的特性,和byte类型的字节长度导致的
首先说计算机的加法运算
第一、计算机中的数字是以他们的二进制补码形式进行存储的,计算加法时也以补码形式进行。
第二、byte类型只有1字节,只能表示8位二进制数,去掉1位符号位,byte类型可以表示的最大数是127。
127 --补码形式--> 0111 1111
+ 1 = 1000 0000 结果正是-128的补码。所以在byte类型里 127 + 1 = -128
二、浮点类型和精度丢失
在Java中用浮点类型来表示小数。运算中会出现精度丢失问题,什么是精度丢失呢?打个比方:
public static void main(String[] args) {
System.out.println(1.2 - 1);
}
这段代码的输出结果是 0.19999999999999996
显然是一个错误的结果,造成这种结果的原因就是精度丢失。
我们可以先了解一下浮点类型在我们的计算机当中是如何存储的,
接下来再看0.2转为二进制小数的过程
0.2 * 2=0.4 整数部分为0
0.4 * 2=0.8 整数部分为0
0.8 * 2=1.6 整数部分为1
0.6 * 2=1.2 整数部分为1
小数部分又变成0.2,形成循环,就像十进制无法完全展示出 1/3 ,二进制无法精确展示出0.2,精度丢失就是我们4字节的float,或8字节的double 不足以显示全部的数值。
精度丢失的解决方法是使用BigDecimal类
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal(Float.toString(1.2f));
BigDecimal b2 = new BigDecimal(Float.toString(1));
float s = b1.subtract(b2).floatValue();
System.out.println(s);
}
三、char类型
1.字符类型实际上是一个16位无符号整数,这个整数对应字符的编码
2.java字符类型采用Unicode字符集编码。Unicode是世界通用的定字长字符集,所用字符都是16位
public static void main(String[] args) {
char a = '严';
char b = '\u4e25';
System.out.println(a);
System.out.println(b);
}
输出结果是:严
严
u4e25是严对应的16位unicode码
四、转义字符
对于不方便输出的字符可以采用转义字符表示:
例如:
public static void main(String[] args) {
String a = "{"+" \"jdk\" "+" \n \\jre\\ "+" \r \'jvm\'}";
System.out.println(a);
}
输出:
{ "jdk"
\jre\
'jvm'}
五、boolean类型
boolean(布尔)类型有两个值:flase和true,用来判断逻辑条件。