基本数据类型有8种分别为:
整 形:byte(1bit),short (2bit),int (4bit),long (8bit,在JDK32位的时候长度为4bit)
浮点型:float(4bit),double(8bit)
字符型:char(2bit)
布尔型:boolean (1bit)
整数
1bit有8位其中第1位用来记录正负数(0代表正数,1代表负数),这样就出现0和-0,-0被划分到负数数所以正数比负数少一位。
所以公式为:-2^(字节数*8-1) ~ 2^(字节数*8-1)-1
1bit 的公式为 -2^7~2^7-1,取值范围为 -128~127
2bit 的公式为 -2^15~2^15-1,取值范围为 -32768~32767
4bit 的公式为 -2^31~2^31-1,取值范围为 -2147483648~2147483647
8bit 的公式为 -2^63~2^63-1,取值范围为 -922337203684775808 ~ -922337203684775807
浮点
float 和 double内存中是按IEEE754存储的,所以比long都要大。
float:1bit(符号位) 8bits(指数位) 23bits(尾数位),2^-149~2^128-1
double:1bit(符号位) 11bits(指数位) 52bits(尾数位),2^-1074~2^1024-1
字符
char取值范围 Unicode '\u0000' ~ '\uFFFF',由于1bit只有256大小无法满足中文存储所以char为2bit
布尔类型
boolean取值范围 false 和 true,不能强制类型转换
强制类型转换,大bit转小bit会把字节砍掉可能导致为负数
public class Test1 {
public static void main(String[] args) {
float f = 1.1F;
int a = (int) f;
System.out.println(a);
byte b = 100;
a = b;
System.out.println(a);
a = 1000; // 如果int转换成byte会把前面的字节砍掉字节 1111101000 -> 11101000
b = (byte) a;
System.out.println(b);
char c = '浪';
System.out.println((int) c);
char c2 = 28010;
System.out.println(c2);
}
}
// 结果
1
100
-24
基本数据类型还有对应的封装类:Byte、Short、Integer、Long、Float、Double、Character、Boolean
Integer对int基本数据类型进行了封装,提供了一系列的方法。
Integer a = 127; // 实际上编译器会将127转化成Integer.valueOf(127)
Integer i = Integer.valueOf(127);
Integer i2 = new Integer(127);
Integer a2 = 127;
System.out.println(a == i);
System.out.println(a == i2);
System.out.println(a == a2); // 如果与基本类型比较,编译器会将a转化成a.intValue()
结果:
true
false
// 值得注意的是valueOf方法对-128~127做了缓存,直接返回cache数组的常量,而其它Byte、Short、Long也做了相应的处理
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}