文章目录
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);
本文详细介绍了Java中的数据类型,包括基本数据类型如整型、浮点型、字符型的特性和转换规则,以及转义字符和字符编码。特别讨论了数据类型转换的细节,包括自动转换和强制转换,并通过实例展示了不同类型混合运算可能导致的精度损失和数据溢出问题。
1758





