001-计算系统ComputationalSystem(一)

 

 

计算系统ComputationalSystem(一)

 

 

为什么计算机只识别读取1和0

1.在计算机中,1和0代表电压等级。
2.相比较,硬件组件更容易识别两个值,而不是很多值
3.用两个信号,强电压和弱电压,这样出错的概率更小
4.这些二进制计算机构件被称作 逻辑门

 

 

 

组合和模式
1.我们把电压等级看作信号,然后对他们分配标签,
分别就是0和1,或者false和true
0就是false,1就是true

2.这样的话,我们就可以用两个信号,来代表4种不同的模式,比如这样
00 01 10 11
这样就是4种不同的形式

3.同样的道理,如果我们用3个信号,那么就是8种不同的形式,
000, 001, 010, 011, 100, 101, 110, 111

4.以此类推,
2个信号,4种形式
3个信号,8种形式
4个信号,16种形式
那么实际上
n个信号,就是2^n,也就是2的n次方种形式
比如
8个信号就是2^8,2的8次方
也就是256种

 

 

 

 

 

 

十进制数字系统
我们平时的数字系统是十进制
打个比方,如果我们要用十进制表示147,
百位是:1
十位是:4
个位是:7
那么实际上是这样的
百位:1*100, 也就是1*10^2
十位:4*10,也就是1*10^1
个位:7*1,也就是1*10^0

从个位开始,是10^0,10^1,10^2
个位是0次
十位是1次
百位是2次
千位是3次
万位是4次
以此类推

 

 

 

 

二进制数字系统
二进制只使用了2个数字,0和1,
如果我们用2进制表示147,
就是这样

和十进制是一样的道理
第一位:2^0
第二位:2^1
第三位:2^2
以此类推

 

 

 

 

把十进制转成二进制
我们试着把一个十进制数转为二进制
比如:83.375
首先我们转整数位83

 

这边我来一个手写版本

第一步

意思就是,83/2==41......1

我们把余数写在左边,

然后继续对41做2的整除

41/2==20......1

也是把余数写在左边,

以此类推,最后的结果是这样

 

然后结果是从下到上

所以83的二进制是

0101 0011

 

 

 

 

我们再来试一次,随便来个数字

比如: 23

这样的话,23的二进制就是

0001 0111

 

 

 

 

再来一次,来个数字

比如: 98

所以98的二进制就是

0110 0010

 

还是挺简单的

就是做几次除法就好了

 

 

 

 

 

然后我们要把小数部分也转为二进制
比如0.375
0.375*2=0.75,第一位 0
0.75*2=1.50,第二位 1
0.5*2=1,第三位 1

 

 

 

但是有时候小数转二进制会出现一些问题
比如这样

我们发现,0.91,会一直这样进行下去

 

 

 

 

小数精确度
比如0.91是0.111010001
我们要精确到小数点后三位
那么我们这样看
0.    1    1    1    0
      一   二   三   四

精确的方法是:
看三位的后面这一位,
如果是0,那么直接忽略,就是0.111
如果是1,那么要+1,

比如要精确到小数点后四位
0.    1    1    1    0    1
      一   二   三   四  五
后面的这一位是1,所以
0.1111

 

 

再比如
把0.01111精确到小数点后四位
那么就是
0.01111+0.0001=
0.1000

 

 

 

 

常用的进制主要有
二进制
八进制
十进制
十六进制

 

 

 

 

 

 

把十进制转成八进制
我们要先把十进制转成二进制
比如
83的二进制是0101 0011
八进制就是2的3次方
那么就是3位代表一个数字
所以
001 010 011
  1     2     3
所以83的八进制是123

 


再来试一个数字,比如98
98的二进制是0110 0010
所以
001 100 010
  1     4     2
所以98的二进制是142

 

 

 

再来试试把83和98转为十六进制
和八进制是一个道理
只不过用4位来表示一个数字

比如83
二进制是 0101 0011

0101   0011

   5         3

所以是 53

 

 

再来看98

0110 0010

   6        2

所以98的十六进制是62

 

 

 

 

定点数fixed-point number

定点数是什么意思,就是整数位和小数位都保持一致

比如1.2    3.4    6.5,这三个数的整数位都是1位,小数位都是1位,就是定点数

比如32.533  45.643  54.566  这三个数的整数位都是2位,小数位都是3位,也是定点数


特点:
1.每个数字的数位是一样的
2.小数点在的位置都是一样的

整数其实都是定点数,比如
8,   74,   163
其实就是
008.       074.     163.

 

 

 

 

范围和精度

范围:最大和最小数之间的距离
精度:临近的两个数之间的差距
举个例子
0.1     4.6     8.9
这三个数,
范围是[0.0, 9.9],0.0到9.9
精度是相邻的两个数比如4.6和4.7之间的差距0.1
误差是0.1/2=0.05

 

权衡trade-off
刚刚的例子中,
如果小数点在最右边,那么就是[00,99]
precision精度是1.0
如果小数点在最左边,那么就是[.00, .99]
precision精度是0.01
所以只能表示00到99或者.00到.99
只能表示100个数

 

 

 

 

数据表现
计算机基本上都是用数字操作
基本上所有的数据都可以被编码成数字
比如
1.计算机程序指令
2.字母和字符
3.音乐符号
4.屏幕像素
5.机器人手臂的位置
等等等等

 

 

 

 

负数negative number

整数是包含了正数和负数的,我们已经知道了如何在二进制表示正数,那么如何表示负数呢
我们用8个位(bit)来表示一个字节(byte)
那么如果只表示正数,我们可以用8位来表示
2^8,2的8次,256个数
那么就是0到255

那么如果考虑到负数的情况,我们就要分配一半给负数
那么就是128个正数和128个负数
这样的话我们就用8位中的第一位来表示符号
这个位叫做符号位sign bit
0的话就是正数
1的话就是负数
比如:
0000 1101 就是 +13
1000 1101 就是 - 13

有一个问题就是,0怎么表示
除了0,有255个数字,不好分配
所以
0000 0000 是 +0
1000 0000 是 - 0

一个n位的带符号的数字的范围就是
-(2^(n-1) -1) 到 +(2^(n-1) -1)
比如8位就是
-127 到 +127
-2的7次-1  到 +2的7次-1

 

 

 

 

二进制补码 Two's complement

1.另外一种来表示负数的方案是 二进制补码
2.正数0到127还是不变的
3.1000 0000表示-128
   1000 0001表示-127
由此
   1111 1110表示-2
   1111 1111表示-1
  10000 0000表示-0

为什么要用补码
我们想象一下,如果用反码来计算+2加上-2
0000 0010
1000 0010
加起来是
1000 0100,变成了-4
这样计算完全出现问题
所以必须要把符号位和数字位分开

但是如果用补码来计算,符号位不用分开
+2加上-2是这样
0000 0010
1111 1110
=1 0000 0000
正好是0

 

 

补码的优点

补码的一个重要优点是,它确保了在二进制加法下,一个负数的加法等于零,并且这个加法可以跨越符号边界。

1.数的表示
如果不用补码,就要对计算机加入一个物理部件来处理符号位,非常不好
2.数的运算
用补码的时候,完全不用考虑符号位
3.自身逻辑意义
对一个数求补,逻辑过程是对这个数的所有的二进制位按位取反再加1。现实含义是求出这个数对应的负数形式。对11101100求补就是求出这个数对应的负数的形式,直接操作下11101100,先所有位取反00010011,再加1就成了00010100。对11101100求出其补码的含义:11101100按照现行补码码制表示的有符号数是-20,对于-20求补就是求出其对应的负数-(-20),现实中-(-20)是+20,那么求补运算的结果符合现实情况吗,00010100转换成有符号数正是+20,这就说明了补码自身逻辑意义是完整的,是不会自相矛盾的。

 

 

 

正数原码求补码

正数原码和补码就是一样的

 

负数原码求补码

先拿到负数的绝对值的二进制原码,然后取反,然后再加1

举个例子,-83的补码

先求+83的原码,是0101 0011

然后取反,就是1010 1100

然后这个取反结果再加1,就是 1010 1101

我们来验证一下

0101 0011 加上

1010 1101 ==

0000 0000

 

 

 

 

java中的整数
1.java用补码存储整数
2.java用带符号位的整数

 

 

 

 

浮点 Floating Point


浮点,又叫科学计数法
比如:
4433.22=4.43322*10^3
4.43322叫做 mantissa ,尾数,或者假数,定点部分
3是exponent 指数
mantissa       m满足1<=m <10

 

1.浮点增加了我们可以表示的数字的范围
2.浮点增加了准确性
举例:
443322000000=4.43322*10^12
0.000000004433=4.433*10^-12
如果用定点数的话,就不能用有限的内存来表示非常大的数字或者非常小的数字

 

 

二进制浮点
0101 1010.1101二进制用浮点表示变成
1.0110101101*2^6

再举个例子
1.010*2^3= 1010 = 10 十进制

 

 

 

IEEE浮点表示法

The Institute of Electrical and Electronic Engineers (IEEE)电气电子工程师协会提供了一种标准浮点格式
1 <= mantissa < 2

来看一条公式

 

X = 数值
S = sign 符号位
E = 指数
B =
F = 尾数
E-B= 真实的指数
1+F=真实的尾数

举个例子
1101 0000 0000 0000 0000
这个数用浮点标准表示为(-1)^0 * 1.101 * 2^15
0是S,符号位,正数
15是E-B,真实指数
1.101是1+F,真实尾数

 

除了IEEE的其他浮点格式只能存储标准数字
不能存储0,不能表示无限,不能存储非常规数字

但是IEEE格式可以存储
1.常规数字
2.非常规数字
3.+0和-0
4+∞和-∞
5.非数字

 

 

 

 

单浮点的极端指数

 

 

 

十六进制IEEE浮点数


 

 

举例:
3F800000

 

 

 

 

 

 

上溢出与下溢出


Overflow and Underflow
如果一个数字的大小太大而不能在存储位置中表示,就会发生上溢出
如果一个数字的大小太小而不能在存储位置中表示,就会发生下溢出

在java中,IEEE浮点数有两种,32位和64位

 

 

 

 

 

ASCII

ASCII(American Standard Code for Information Interchange:美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言

1.给一个8位,就可以编译256个不同的字符
2.最常用的就是ASCII
3.ASCII基于7位,8位中的第一位用来做错误检测或者校验位

 

 

 

 

 

Unicode 双字节编码

1.java采用了16位进行编码,也就是2个字节,
叫做Unicode,双字节编码
2.包括了ASCII,也包括其他语言的字符
3.16位的话就是65536个字符,但是世界语言大概有30万个字符
4.UTF-16用2个字节来编码
5.UTF-8用1-6个字节来编码

 

 

 

 

以上就是第一节课的全部内容了

好好学习

天天向上

加油

加油

加油

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值