JAVA基础 基本数据类型
- xx.java ----源文件,人能看懂的文件
- 利用javac命令,将.java文件变成.class文件,也就是二进制字节码文件,让计算机能看懂
- 无论是哪个类型的文件,都是以文件的形式存储在磁盘中
计算机存储与处理流程
- 通过java命令,将.class文件编译进计算机内存当中
数据类型
定义:数据在内存中的存储形式
强数据类型语言:C C++ java,定义变量时有不同具体的变量名称
int a = 10;
float b = 10.11;
弱数据类型语言:js python,定义变量时变量名称相同
var a = 10;
var b = 10.11;
区别:对于强数据类型语言,必须清楚数据在内存中的存储形式和大小(int a = 10和byte a = 10不一样)
对于弱数据类型语言,只需要考虑数据存储,不需要考虑存在形式
-
基本数据类型
-
整形:byte short int long
byte:8bit 1bit符号位 7bit数值位
short:16bit 1bit符号位 15bit数值位
int:32bit 1bit符号位 31bit数值位
long:64bit 1bit符号位 63bit数值位
-
浮点型:float double(阶位是小数点存在的位置)
float:32bit 1bit符号位 8bit阶位 23bit数值位
double:64bit 1bit符号位 11bit阶位 52bit数值位
-
布尔型:boolean
-
字符型:char
-
-
引用数据类型
计算机对整型数据的存储方式
-
byte是基本数据类型-------------->数据类型决定数据在内存中如何存储
-
byte大小是8bit(1字节)
-
数据类型的源码:数据直接转换成对应的二进制形式,然后根据数据类型进行补充,其中正数最高位0,负数最高位是1
例子:
byte a = 10; 00001010(源码)
byte b = -10; 10001010(源码)
int a = 10; 00000000000000000000000000001010(源码)
short b = -12; 100000000001100(源码)
十进制与二进制转换
- 除余法
- 直接写
1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 210 | 211 | 212 |
例如:十进制27=16+8+2+1=24+23+21+20 转换为二进制就是11011,哪位有写就在哪位写1
二进制加减运算
byte a = 10; 00001010(源码)
byte b = -10; 10001010(源码)
运算:a+b==(二进制在进行加减运算的时候,符号位也参与运算)==
错误示范
计算机存储数值类型的数据肯定不是存储源码,因为源码的相反数相加不是0
-
反码:正数的反码 = 源码
负数的反码 = 源码的符号位不变,其余位按位取反
a:反码 00001010(反码)
b:反码 11110101(反码)
转换为源码为:10000000也就是-0,计算机存储数值类型肯定不是存储反码,因为反码存在+/-0的问题
-
补码:正数的补码 = 反码 = 源码
负数的补码 = 在反码的基础上末尾+1
a:补码 00001010(反码)
b:补码 11110110(反码)
因为数据类型在内存中的存储大小,此时需要从右往左一次截取数据,所以结果最终为a+b = 00000000 -----> 0 -
计算机当中存储数值类型数据使用的是补码的形式
经典面试题 127+1 = -128
// 为什么 127+1是-128
byte a = 127;
byte b = 1;
byte c = (byte) (a+b);
System.out.println(c);
结果为:
为什么??——数据越界问题
因为byte类型的范围是:-128~127,此时如果127+1还在byte类型的表示范围内,那只能是等于-128
// byte类型 8bit 最高位是符号位 数值位只占有7位
// byte类型中: 00000000 00000001 00000010 00000011...01111111
// 0 1 2 3 127
//-1 10000001(源码)----->11111110(反码)----->11111111(补码)
//-2 10000010(源码)----->11111101(反码)----->11111110(补码)
//-3 10000011(源码)----->11111100(反码)----->11111101(补码)
//-4 10000100(源码)----->11111011(反码)----->11111100(补码)
// ...
//-128 10000000(源码)----->11111111(反码)----->00000000(补码)
//所以存在的问题是数据越界的问题
自动类型转换
大碗装小碗
例1
byte a = 127;
byte b = 1;
byte c = (byte)(a+b);
System.out.println(a+b); // 输出时会自动转型为int类型,所以不会越界,输出值为128
System.out.println(c); //这里因为c的类型为byte,所以输出为-128
上面的例子中,System.out.println(a+b);就是自动类型转换。
自动类型转换具体细节如下图:
强制类型转换
小碗装大碗,但是绝大多数情况会造成精度丢失
例2
byte a = 127;
short b = a;
// byte c = b; 报错 需要进行强制类型转换
byte c = (byte) b; // 进行强制类型转换之后会造成精度丢失
// short 数值位16bit
// byte 数值位7bit