各种基础数据类型所占字节数的大小(单位:Byte,其中1 * Byte= 8 * bit)
数据类型名称 | byte | short | int | long | float | double | char | boolean |
---|---|---|---|---|---|---|---|---|
数据类型 | 整数型 | 整数型 | 整数型 | 整数型 | 浮点型 | 浮点型 | 字符型 | 布尔型 |
所占字节大小 | 1 | 2 | 4 | 8 | 4 | 8 | 2 | 1 |
①byte 字节型数据类型,在内存中占用一个Byte 所能表示的范围为:-128127(-2^72^7-1)
在内存空间中存储模拟图:展示为-128和127(主要依据为二进制转换)
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|---|---|---|---|---|---|---|
0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
即-128 = -2^7,127 =2^7-1;
②short 在内存中占用两个Byte 所能表示的范围为:-32768~32767 (-215~215-1)
③int 整型 在内存中占用四个Byte 所能表示的范围为:-2147483648~2147483647 (-231~231-1)
④**long 长整型 在内存中占用八个Byte 所能表示的范围为: **
-9223372036854775808 ~9223372036854775807 (-263~236-1)
其中在实际操作过程中byte、short、int、long在面临字面量为整型的数据时、其字面量默认为int型,需要注意的是在此时应该使用强制转换,以防丢失,或无法通过编译
float类型和double类型
public class Demo {
public static void main(String[] args){
float f = 3.1415926;//报错,因为字面量为小数时默认为double型,而double类型为8个Byte,float类型为4个Byte
//因为数据类型在电脑中是通过二进制的形式在存储空间中存储这一机制我们就能理解这里为什么会出现编译无法通过的原因
float f1 = 3;//在这没有报错的原因和上面报错的原因、机制是一样的
// 因为int型是4个Byte,float类型也是4个Byte所以在存储空间上不会出现溢出、越界这种问题故能编译通过
double d = 3.1415926;
System.out.println(f);//无法通过编译不能输出
System.out.println(f1);//输出为3.0
System.out.println(d);//输出为3.1415926
}
}
char类型
public class Demo {
public static void main(String[] args){
char c = 'a';
System.out.println(c);//输出结果为"a"
//其中char类型可以转换为int型,而int型却不能随意转换为char类型
}
}
//因为int型为4个Byte char为2个Byte
public class Demo {
public static void main(String[] args){
char c = 97;
System.out.println(c);//输出结果为"a"
}
}
public class Demo {
public static void main(String[] args){
char c = 32767;
System.out.println(c);//输出结果为"翿"
}
}
public class Demo {
public static void main(String[] args){
int i = 'a';
char c = i;//编译无法通过
System.out.println(c);
}
}
主要表述的值为true(真)和false(假)
public class Demo {
public static void main(String[] args){
boolean flag = true;
System.out.println(flag);//输出值为 true
}
}
在计算机内存存储的二进制都是以补码的形式进行存储,在内存中第一位表示符号位,0表示正,1表示负
什么是补码?
对于一个正数来说,它的原码、反码、补码都一个样
如:10的原码:00000000 00000000 00000000 00001010
对于一个负数来说,它的原码、反码、补码是什么样子的、
原码很简单,就是一个整数的二进制表示,第一位是符号位
如:-1的原码:10000000 00000000 00000000 00000001
反码:符号位不变,其他位取反也就是说,原来是0的要变成1,是1的要变成0,记住符号位不变
-1的反码:11111111 11111111 11111111 11111110
补码:反码+1
-1的补码:11111111 11111111 11111111 11111111
通过基本数据类型在存储空间中占用的内存以及数据在计算机中以二进制的形式的存储机制,以及在实际操作中得到的结果可以得知如下图:
其中按照上述规则自动转换,int型和long型转换为float型和double型时可能会丢失精度;
除此之外的强制转换部分代码展示如下:
public class Demo {
public static void main(String[] args){
byte b = (byte)200;
System.out.println(b);//输出结果为 -56
short s = (short)32768;
System.out.println(s);//输出结果为 -32768
//ong l = 2147483648;//编译器无法通过;
long l1 = 2147483648L;
System.out.println(l1);//输出结果为 2147483648
//float f = 3.1415926;//编译无法通过
float f1 = 3.1415926f;
System.out.println(f1);//输出结果 3.1415925
}
}
由上述代码得到的结果也可以知道强制转换存在精度的丢失
最后: 基础数据类型,小转大,在小的一方的取值范围内,可以自动转换,也叫自动类型转换。大转小,要强转,也叫作强制类型转换