计算机的三大硬件
数据类型
数据类型:数据在内存当中的存储形式
语言从数据类型角度分类:
强数据类型语言:例如C C++ java 等,必须知道存储的类型和大小
定义方式
int a=10;
float a=10.00
弱数据类型语言:js python
定义方式
var a=10
var a=10.00
数据类型的分类:
1.基本数据类型
a.整型 byte short int long
数据大小
b.浮点型 float double
数据大小
c.布尔型 boolean
d.字符型 char
2.引用数据类型
a.类 String
b.接口
c.数组
各种数据类型存储所需的字节长度,以及取值范围
磁盘存储数据的原理
磁盘的结构
磁盘的表面并不光滑,而是由一圈圈的磁道构成的,将磁道切开,单看一条磁道的存储
磁盘存储原理:电生磁,磁生电
存储数据:电生磁
当电流通过磁头线圈时,根据安培环路定律,线圈会产生磁场。从而使磁颗粒产生对应的磁场,存储数据 N代表0, S代表1
一个小的磁颗粒都会存储一个比特数据
读取数据:磁生电
磁颗粒会产生磁场,磁头划过磁颗粒产生电流,通过电流的方向,判断存储0/1
计算机80%以上的事件都是读取数据
cpu运行效率分析
磁盘找数据的时间3-5ms
CPU计算数据的时间0.2ns
1ms=1*10^6ns
如果磁盘之间将数据共给CPU,这是不合理的,因此我们需要借助内存
内存查找数据的时间大约是20ns左右
CPU的工作效率大约是10%
内存的存储数据的原理
内存采用的方案:电容器,电容----->电池
在内存当中,每一比特的数据都是存储在一个电容当中
存储数据:
0就给电容充电,1就不给电容充电
读取数据:
通过放电,检测电容是否带电,来读取数据
计算机对数据的存储方式
例题:
byte a=10
byte b=-10
byte是基本数据类型----------->数据类型决定数据在内存当中如何存储
byte大小是8bit(1字节) 1bit符号位 7bit数值位
十进制数转化成二进制的方法
10:1010 除余法
配凑的方法
1 2 4 8 16 32 64 128 256 512 1024 2048 4096
10=8+2=1*2^3+0*2^2+1*2^1+0*2^0
1010
byte a=10 #10:0 00001010
byte b=-10 #10:1 00001010
数据的二进制表示方式
源码
数据直接转换成对应的二进制形式,然后根据数据类型进行补充,其中正数最高位是0,负数最高位是1
int a=-10
1 0000000 00000000 00000000 00001010(源码)
short b=-12
1 0000000 00001100(源码)
运算:a+b (二进制在进行加减运算的时候符号位参与运算)
计算机存储数据肯定不是存储源码,因为源码的相反数相加结果不是0
反码
正数的反码=源码
负数的反码=源码的符号位不变,其余按位取反
a:反码:0 0001010
b:反码 1 1110101
此时执行a+b 00001010 +11110101 -------------- 11111111(反码)------->10000000(源码)---------->-0
计算机存储数据肯定不是存储反码,因为反码存在正负0的问题
补码
正数的补码=反码=源码
负数的补码=在反码的末尾+1
a:00001010(补码)
b:11110110 补码) 00001010 11110110
100000000----------->因为数据类型规定了数据在内存中的存储大小,此时截取数据(从右往左) 00000000
00000000(补码)----------->00000000(源码)=0
计算机当中存储数据使用的是补码的形式
计算机中整型数据的存储
public class main {
public static void main(String[] args){
byte a=127;
byte b=1;
byte c=(byte) (a+b);
//byte类型 8bit 7位
//byte类型当中:
//01111111 127 最大数
//10000000 -128 最小数
//2^8一共可以表示256个数,0-127已经表示了128个数,前面只能是有128个负数,-1~-128
//因为byte类型的范围是-128~127,此时如果127+1还在byte类型的表示范围之内,此时值=-128
//a+b: 01111111+00000001=10000000
}
}
输出结果:
解释原因
byte类型 8bit 7位
byte类型当中:
01111111 127 最大数
10000000 -128 最小数
2^8一共可以表示256个数,0-127已经表示了128个数,前面只能是有128个负数,-1~-128
因为byte类型的范围是-128~127,此时如果127+1还在byte类型的表示范围之内,此时值=-128
a+b: 01111111+00000001=10000000
计算机中浮点型数据的存储
浮点型精度丢失问题
public class main {
public static void main(String[] args) {
//System.out.println(1.2 - 1);//精度丢失
//0.2=(0.00110011...)2
//浮点数默认用double存储,
}
//float单精度类型 1bit 8bit 23bit 共32bit
// double双精度 1bit 11bit 52bit 共64bit
}
精度丢失原因:
数据无法进行完整化的表述,如果对数据进行相应存储位数的舍弃,会导致精度丢失
浮点数二进制转化
//0.2转成二进制存储:小数点后面的数据乘2,并取其整数值
//0.2*2=0.4 ----0
//0.4*2=0.8 ----0
//0.8*2=1.6 ----1
//0.6*2=1.2 ----1
//0.2*2=0.4 ----0
//0.4*2=0.8 ----0
//0.8*2=1.6 ----1
//0.6*2=1.2 ----1
//.....
输出结果:
解决方案:
BigDecimal 完成对精度要求非常高的计算
public class main {
public static void main(String[] args) {
//和精度强相关 BigDecimal 完成对精度要求非常高的计算
BigDecimal b1=new BigDecimal(Double.toString(1.2));
BigDecimal b2=new BigDecimal(Double.toString(1));
Double value=b1.subtract(b2).doubleValue();//将相减的结果转为double类型
System.out.println(value);
}
//float单精度类型 1bit 8bit 23bit 共32bit
// double双精度 1bit 11bit 52bit 共64bit
}
关于显示器显示数据的方案
计算机存储视觉信息和听觉信息
视觉信息包括:颜色,亮点,坐标 颜色和亮度可以归为一个
听觉信息包括:音色,振幅,时间间隔
视觉信息
显示器通过像素点进行显示,左上角的点是像素原点
计算机存储像素点:
每个像素点展示:红黄蓝三原色 (0-255)每个数值可以看作byte 共有3byte
每个元素的坐标 : 2short类型 (2*16bit)
计算机存储一个像素点消耗7bit------56bit
如果一个屏幕中有2^16*2^16个像素点,对这项像素点进行存储,所需要的存储空间是非常庞大的。
如果存储一些字符,abc 平均每个文字200个像素点进行存储,大约11200bit
计算机是无法存储如此庞大的数据,所以用字符集的方式减少计算机的存储量
字符集ASCII码
通过自定义映射表的方式
假设用如下的字符集进行存储
存储abc只需要24bit,大大减少存储空间
对于字符的颜色和大小,由于文本形式,我们只需要对文件的最左上角的像素点的坐标,就可以对文件当中所有字符坐标进行存储,对于颜色会进行单独存储 。因此字符集会简化字符的存储
乱码:
产生原因:发送方和接收方采用了不同的字符集转换二进制数据
假设左侧为发送方采用的字符集,右侧为接收方,接收方采用ASCII码进行存储,每8bit表示一个字符,但是由于两端编码在不同的字符集当中对应不同的字符,因此导致乱码。
char类型
1.字符类型实际上是一个16位无符号整数,这个数对应字符的编码
2.java字符类型采用Unicode字符集编码。Unicode是世界通用的定字长字符集,所用字符都是16位
utf-8中的u指的是unicode
public class main {
public static void main(String[] args) {
char a1='中';
char a2='\u4e2d';
System.out.println(a1);
System.out.println(a2);
}
}
’4e2d‘为’中‘所对应的16位Unicode编码
3.任何一个字符都可以转化为一个整数,整数的范围是0-65535
public class main {
public static void main(String[] args) {
int a1='中';
System.out.println(a1);
}
}
4.可以查看某个数对应着那个字符
public static void main(String[] args) {
char c = 69;
System.out.println(c);
转义字符
对于不方便输出的字符可以采用转义字符表示:
例如:
public static void main(String[] args) {
int num=100;
String json="{"+"\"count\":"+num+"}";
System.out.println(json);
String dataString="[{\"id\":\"1\",\"name\":\"张三\"},{\"id\":\"2\",\"name\":\"李四\"}]";
System.out.println(dataString);
}
转义字符 含义
\n 表示回车
\r 表示换行符
\\ 表示反斜杠( \ )
\' 表示单引号( ' )
\" 表示双引号( " )
boolean类型
boolean(布尔)类型有两个值:flase和true,用来判断逻辑条件。数值型和boolean之间不能直接转化。
自动类型转换--大碗装小碗
自动类型转化图
int转化成float,32位数值为转化成带有23位数值位的浮点数,会造成精度丢失,数值较大会造成精度丢失
long转化成double,64位数值为转化成带有52位数值位的浮点数,会造成精度丢失,数值较大会造成精度丢失
强制类型转换---小碗装大碗
极大概率会造成精度丢失
例如
public static void main(String[] args) {
int a=1314;
byte b=(byte) a;
System.out.println(b);
}
int转化为byte,在数值较大的情况下导致精度丢失,如下,10bit的int类型数据转化成8bit的byte类型数据,会丢弃一部分数据导致精度丢失
数据较小,则不会产生精度丢失
3bit的int类型数据转化成8bit的byte类型数据,不会导致精度丢失
数据的运算
public static void main(String[] args) {
//除号是整除运算
System.out.println(5/2);//如果是被除数是整型的话,结果是整型
System.out.println(5.0/2);//如果是被除数是浮点型的话,结果是浮点型
//System.out.println(10.0/0);
//System.out.println(8/0);//会报错
// System.out.println(5%2);//取余运算
// System.out.println(3+2*12/4);
// System.out.println((3+9)*8.0/2%2);
}
结合赋值和运算符
x+=4
x=x+4
自增自减运算符
++m先加再赋值,m++先赋值再加