一、数据类型:数据在内存当中的存储形式
分为基本数据类型和引用数据类型
基本数据类型:
包含整型(byte short int long)、浮点型:float double、布尔型:boolean、字符型:char
1.整型:byte short int long
整型类型 | 大小 | 组成 | 范围 |
byte | 8bit | 符号位+数值: 1bit+7bit | 127 ~ -128 |
short | 16bit | 符号位+数值: 1bit+15bit | |
int | 32bit | 符号位+数值: 1bit+31bit | |
long | 64bit | 符号位+数值: 1bit+63bit |
注意:应用时不能超出类型的范围,超出范围数值不准确,例如:
public static void main(String[] args){
byte a = 127;
byte b = 1;
byte c = (byte)(a+b);
System.out.println(c);
} //该输出结果为-128 因为128没有在byte的表示范围内
2.浮点型:float double
float | 32bit | 符号位+阶位(存储小数点位)+数值:1bit+8bit+23bit | 单精度类型 |
double | 64bit | 符号位+阶位(存储小数点位)+数值:1bit+11bit+52bit | 双精度类型 |
注意:数据以浮点数形式存储,面对二进制是无限循环的小数会产生精度误差。
解决方法:用 BigDecimal 类进行高精度计算 要引入import java.math.BigDecimal;
public static void main(String[] args){
System.out.println(1.2-1);
} //运行结果:0.19999999999999996
//引入BigDecimal 类
//doubleValue() 将BigDecimal 结果转换为double 类型 subtract相减
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal("1.2");
BigDecimal b2 = new BigDecimal("1");
Double value = b1.subtract(b2).doubleValue();
System.out.println(value);
}
3.布尔型:boolean
boolean(布尔)类型有两个值:flase和true,用来判断逻辑条件。数值型和boolean之间不能直接转化。
4.字符型:char
1.字符类型实际上是一个16位无符号整数,这个数对应字符的编码
2.java字符类型采用Unicode字符集编码。Unicode是世界通用的定字长字符集,所用字符都是16位
3.任何一个字符都可以转化为一个整数,整数的范围是0-65535
二、计算机对整型数据的存储方式:
数据类型 变量 = 数值; (数据类型决定数据在内存中如何存储)
1.数据类型直接转化对应的二进制形式
2.根据数据类型进行补充 在数值前面用0填补
3.正数符号位为0 负数符号位为1
反码:
正数的反码 = 源码;
负数的反码 = 源码的符号位不变,其余按位取反;
例:
补码: 计算机当中存储数据类型的形式
利用补码运算
正数的补码 = 反码 = 补码;
负数的补码 = 在反码的基础上末尾加1;
数据 | 源码 | 反码 | 补码 |
short c = -12; | 1 000000000001100 | ||
byte a = 10; | 0 0001010 | 0 0001010 | 0 0001010 |
byte b = -10; | 1 0001010 | 1 1110101 | 1 1110110 |
运算:
例:
二进制转换:
1.将二进制数中的每一位从右向左标记为第0位、第1位、第2位...。
2.对于每一位,将其值(0或1)乘以2的相应次方(从0次方开始)。
3.将所有乘积相加,得到的结果即为十进制数。
三、转义字符:
对于不方便输出的字符可以采用转义字符表示:
----------------------------------------------------------------------------------------------------------------
转义字符 含义
\n 表示回车
\r 表示换行符
\\ 表示反斜杠( \ )
\' 表示单引号( ' )
\" 表示双引号( " )
---------------------------------------------------------------------------------------------------------------------
例:
public static void main(String[] args) {
int num = 100;
String json = "{"+"\"count\":"+num+"}";// /斜杠 \反斜杠
String dataString = "[{\"id\":\"1\" ,\"name\":\"张三\"},{\"id\":\"2\" ,\"name\":\"李四\"},{\"id\":\"3\" ,\"name\":\"王五\"}]";
System.out.println(json);
} //输出结果:{"count":100}
四、类型转换:
1.基本数据类型转换:
例:
public static void main(String[] args){
byte a = 127;
byte b = 1;
byte c = (byte)(a+b);
System.out.println(c);
} //该输出结果为-128 因为128没有在byte的表示范围内
但此时更改代码直接输出a+b的结果,则输出结果为128。因为此时进行了基本类型转换,将byte自动转换为int类型。
public static void main(String[] args){
byte a = 127;
byte b = 1;
System.out.println(a+b);
}
2.强制类型转换:
小碗装大碗,可能会数据丢失
数据丢失的情况:
2.1.浮点数到整数
当将浮点数转换为整数时,小数部分会被截断,导致精度丢失。
public static void main(String[] args){
double a = 5.99;
int b = (int) (a);
System.out.println(b);
} //运行结果5 小数部分被丢弃
2.2.较大整数到较小整型
将一个较大的整数转换为较小的整数类型。
public static void main(String[] args){
int a = 129;
byte b = (byte) (a);
System.out.println(b);
} //运行结果为-127 因为129超出了byte的最大范围
2.3.字符到整数
将字符转换为整数时,得到的是其 ASCII 值,但如果字符本身不能直接表示为整数,可能会导致误解。
public static void main(String[] args){
char c = 'A';
int i = (int)(c);
System.out.println(i);
} //运行结果 65 没有丢失,但对于非标准字符或特殊字符可能存在问题
2.4.布尔值到整数
将布尔值转换为整数时,true 转为 1,false 转为0,这不会丢失精度,但逻辑信息可能会丢失。