一、数据类型(定义变量)
数据类型指的是数据在内存当中的存取形式,目前主流的设计语言分为两大种形式,分别为强数据类型语言和弱数据类型语言。
1、数据的存储形式
数据的类型分为两种,分别是基本数据类型,和引用数据类型。
例:
整形与浮点型各种类型大小
整形和浮点型数据存储方式
对于强类型语言,在考虑一个数据时,必须考虑数据的数据大小与数据形式,以存取在内存当中。对于弱类型语言,只需要考虑数据存储而不需要考虑数据在内存当中如何去设计。
2、基本数据类型:包括整形( byte、short 、int 、long),浮点型( float、 double),布尔类型( boolean),字符类型(char)。
二、计算机对整形数据的存储方式
1、二进制转换(十进制转二进制)
①除余法(除2取余,从下往上数)
②分解法(分解转换的数与2的次数相对应,从右往左数)
2、源码
数据的源码:数据直接转换成对应的二进制形式,然后根据数据类型进行补充,其中正数最高位0,负数最高位是1
例:
byte是基本数据类型,数据类型决定数据在内存当中如何存储,byte大小是8bit(1字节) 1bit符号位 7bit代表数值位。
byte a = 10;: 00001010 (源码)
byte b = -10; 10001010 (源码)
3、反码
正数的反码 = 源码
负数的反码 = 源码的符号位不变,其余按位取反
例:
a:反码: 00001010 (反码)
b:反码: 11110101 (反码)
4、补码
正数的补码 = 反码 = 源码
负数的补码 = 在反码的基础上末尾+1
例:
a:补码: 00001010 (补码)
b:补码: 11110110 (补码)
5、计算机当中存储数值类型数据使用的是补码的形式。
原因:①计算机存储数值类型的数据不能是存储源码,因为源码的相反数相加不是0;
②计算机存储数值类型的数据不能是存储反码,因为反码存在+-0的问题;
③虽然用补码计算,有时会超出数据的原有的数据位数,但是因为数据类型规定了数据在内存当中的存储大小,此时截取数据即可。
例:运算:a + b (二进制在进行加减运算的时候,符号位也参与运算)
byte a = 10;: 00001010 (源码)
byte b = -10; 10001010 (源码)
①源码运算
②反码运算
a:反码: 00001010 (反码)
b:反码: 11110101 (反码)
③补码运算
a:补码: 00001010 (补码)
b:补码: 11110110 (补码)
6、数据运算特殊题型
byte a = 127;
byte b =1;
二者相加却为-128(byte类型)代码如下:
public static void main(String[] args){
byte a=127;
byte b=1;
byte c =(byte) (a+b);
System.out.println(c);
}
运行该代码所得结果为-128
原因:byte类型的范围是 -128~127,如果此时127+1还在byte类型的表示范围内(计算机中整数以二进制的形式进行存储,当最高位为1时为负数,为0时为正数,而在二进制加法中,正数的源码,反码,补码值相同。127(二进制0111 1111)加上1(0000 0001)相加为1000 0000这恰好是-128的二进制表示形式), 此时值应为-128。
三、浮点型数据
浮点型包括float(单精度)和double(双精度)计算机存储小数默认用double类型。
1、小数转化为二进制数,乘二取整(从下往上读,0.2在二进制中是一个无限循环数)
例:
2、精度丢失问题
原因:计算机存储小数默认用double类型,而double数据类型大小固定,而有些书为无限循环数、所以数据会被进行裁剪,因为裁剪而有些数据无法进行完整度的表述,产生精度丢失问题。
例:结果为0.199999.........
public static void main(String[] args){
System.out.println(1.2-1);
}
解决办法:跟精度强相关,在Java中用BigDecimal类解决
public static void main(String[] args){
BigDecimal b1=new BigDecimal(Double.toString(1.2));
BigDecimal b2=new BigDecimal(Double.toString(1));
Double value =b1.subtract(b2).doubleValue();
System.out.println(value);
}
四、char类型
1.字符类型实际上是一个16位无符号整数,这个数对应字符的编码
2.java字符类型采用Unicode字符集编码。Unicode是世界通用的定字长字符集,所用字符都是16位
public static void main(String[] args) {
char c1 = '中';
char c2 = '\u4e2d';
System.out.println(c1);
System.out.println(c2);
}
注释:’4e2d‘为’中‘所对应的16位Unicode编码
3.任何一个字符都可以转化为一个整数,整数的范围是0-65535
public static void main(String[] args) {
int a = '中';
System.out.println(a);
}
4.可以查看某个数对应着那个字符
public static void main(String[] args) {
char c = 69;
System.out.println(c);
}
输出:E
5、转义字符
对于不方便输出的字符可以采用转义字符表示:
例如:
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}
五、布尔类型
boolean(布尔)类型有两个值:flase和true,用来判断逻辑条件。数值型和boolean之间不能直接转化。