文章目录
1.5 Java数据类型
1.5.1 基本数据类型
数据类型 | 占字节数 | 位数 | 取值范围 | 缺省默认值 |
---|---|---|---|---|
byte(字节型} | 1 | 8 | [-2⁷ ~ 2⁷-1]、[-128 ~ 127] | 0 |
short(短整型) | 2 | 16 | [-2¹⁵ ~ 2¹⁵-1]、[-32768 ~ 32767] | 0 |
int(整型) | 4 | 32 | [-2³¹ ~ 2³¹-1]、[-2147483648 ~ 2147483647] | 0 |
long(长整型) | 8 | 64 | [-2⁶³ ~ 2⁶³-1] | 0L |
float(单精度) | 4 | 32 | [-2³¹ ~ 2³¹-1] | 0.0f |
double(双精度) | 8 | 64 | [-2⁶³ ~ 2⁶³-1] | 0.0d |
boolean(布尔型) | 1 | 8 | true、false | false |
char(字符型) | 2 | 16 | [0 ~ 2¹⁶-1]、[0 ~ 65535] | ‘\u0000’ |
注意:1B(字节)=8bit(位)
1B=8b
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
…
String 字符串属于引用数据类型,不属于基本数据类型。
1.5.2 转义字符
常用转义字符 | 意义 |
---|---|
\b | 退格(BS) ,将当前位置移到前一列 |
\f | 换页(FF),将当前位置移到下页开头 |
\n | 换行(LF) ,将当前位置移到下一行开头 |
\r | 回车(CR) ,将当前位置移到本行开头 |
\t | 水平制表(HT) (跳到下一个TAB位置) |
\\ | 代表一个反斜线字符 \ |
\’ | 代表一个单引号(撇号)字符 |
\" | 代表一个双引号字符 |
1.5.3 Java字符编码
采用Unicode编码(utf-8,utf-16,utf-32)
其中utf-8占用一到四个字节,utf-16占用二或四个字节,utf-32占用四个字节。
彻底搞懂Unicode编码⇨传送门
1.5.4 char字符型详解
整数直接赋值给char:
char c1 = 'a';
System.out.println(c1);
char c2 = 97
System.out.println(c2);
//打印结果都是a
结论:当一个整数赋值给char类型变量时,会自动转换成char字符型数据,结果是一个字符。
1.5.5 两种浮点型数据详解
浮点型:
① float 4个字节 单精度
② double 8个字节 双精度
注意:
-
在银行方面或者财务方面double的精度不够的,在java中的java.math.BigDecimal提供了更高精度的的类型(不属于基本数据类型,是引用数据类型)。
-
long类型占8个字节,float类型占4个字节。
但容量上来说, float容量>long容量
任意一个浮点型都比整数型空间大。 -
java中规定,任何一个浮点型数据默认当作double处理,
如果想让这个浮点型数据被当作float类型来处理,
要在数据后面加上F/f
即:
3.1415926会被默认当作double,
3.1415926F 这才是float类型。
float f1 = 3.14; //报错
float f2 = 3.14F; //正确
float f3 = (float)3.14; //正确
- 浮点型和整数型一起运算:
int x1 = 10.0 / 5; //报错
//先把5转换成double类型,在做运算,结果是double类型,不能用int型接收。
//修改为:
int x2 = (int)10.0 / 5;//先把10转换成int型。
int x3 = (int) (10.0 / 5); //先运算最右边括号在把double类型结果转换成int类型。
//这两种方法都行。
1.5.6 数据类型转换
你知道,编译器不知道:
int a = 1;
short b1 = 1;//正确
short b2 = a;//错误,编译器只知道a是int型,不知道a种存储的数据是什么值。
①自动转换:
long a = 100;
long b = 100L;
//a的100实际上是整形的100赋值给a的。
//b的100后面加了L说明本身就是long类型,无需转换。
②强制转换:
long a = 100;
int b = (int)a;
//(int)是强制转换的标志,括号里是想要转换成的类型。
总结:
小容量向大容量转换称为自动类型转换,容量从小到大的排序为:byte < short(char) <int < long < float < double,其中 short 和 char 都占用两个字节,但是 char 可以表示更大的正整数。
大容量转换成小容量,称为强制类型转换,编写时必须添加“强制类型转换符”,但运行时可能出现精度损失,谨慎使用。
例(超出数据类型定义的范围):
byte b = (byte)300 ;
300是int型(4字节),对应二进制为:00000000 00000000 00000001 00101100
而byte字节型(1字节),对应二进制为:00101100
把前面三组字节信息全部砍去了,导致数据丢失,原本的300最后变成了44。
*上述是留下的一组最左端是0代表正数的情况还有一种可能是留下的一组最左端是1,使得剩下的数据直接变成了负数。
例:
byte b = (byte)150;
//因为字节型取值范围是【-128~127】,150超出了取值范围。
int型150对应二进制码:
00000000 00000000 00000000 10010110
将以上int类型的150强制转换为1个字节的byte类型,最终保留的二进制为:10010110
计算机存储的二进制码都是补码的形式,因为补码方便减法运算。
补码:10010110
反码(补码-1):10010101
原码(根据反码除左端符号位全部取反):11101010
所以最终结果是:-106
1.5.7 多种数据类型混合运算
- byte short char混合运算(都是小于int型容量的运算)
char c1 = 'a';
byte b = 1;
System.out.println(c1 + b); //98
//byte short char做混合运算的时候,各自先转换成int在做运算。
short s1 = c1 + b; //报错,从int转换到short可能会有损失。
short s2 =(short)c1 + b;//报错,只把c1转换成short,b还是int型,加法运算后小的自动转成大的,结果还是int型。
short s3 =(short)(c1 + b);//正确,先int型做加法运算,在转换成short。
2.大于int型容量的运算,最终结果都是转换成容量最大的那个数据类型。
long a = 10L;
char c = 'a';
short s = 100;
int i = 50;
System.out.println(a + c + s + i); //257
int x1 = a + c + s + i;//报错,从long转换到int可能会有损失。
//所以解决方法1:
long x2 = a + c + s + i;
//解决方法2:
int x3 = (int)(a + c + s + i);