《码出高效》读书笔记(上)计算机基础

一、计算机整数存储

1、补码

为什么会有补码?其目的是为了解决计算机用加法器做减法运算。

讲清楚这个要先讲“模”的概念。

“模”是指一个计量系统的计量范围,比如钟表只能表示12个小时,模就是12(只看小时);一个8位的二进制数,模是2的8次方。模其实就是一个窗口,框定了数据表示范围。

那么模有什么用呢?

设想这样一个场景,想将指向8点的钟拨到6点,有两种方法:顺时针拨10个小时,或逆时针拨2个小时,也就是8 + 10 = 8 - 2 ,即8 + 10 = 8 + 12 - 2 = 8 - 2。

此处有结论了,如果想算8 - 2,可以用8 + 10实现,也就是用加法器做减法。-2 和 10的关系是 2 + 10 = 12,那么10 是怎么来的?从二进制来看,将2的二进制每一位都0/1对调,这个数加上原本的2再加1就是模12了。

因此,补码是原码的数字位取反+1。

结论:

补码是一种数据表示方法,正数的补码与原码相同(这是规定),负数的补码为将其数字位取反+1,反过来用补码算原码,也是直接取反+1然后符号位置为1。0的补码还是为0。

补码的意义在于,符号位和数字位可以一起参与运算,加减法都可以用加法器运算。而电子器件处理补码和真值、原码的转换是非常方便的。

计算机中二进制整数都是以补码的形式存储的。

2、左移和右移

左移<<是所有数字左移,低位补0,高位舍弃。在没溢出的情况下,就是乘2的n次方。

右移分为有符号右移>>和无符号右移>>>。有符号右移 ,正数是最高位补0,负数是最高位补1,也就是高位补的都是符号位。无符号右移,不论正负数都是最高位都补0。注意左移和右移都是对补码进行操作,补码操作不关心符号位。

有符号右移应用场景:负数只能用有符号右移。

无符号右移应用场景:有符号右移需要耗费更多的空间,对于unsigned类型的数据,用无符号右移减小空间消耗。

二、计算机浮点数存储

1、浮点数存储

浮点数包含3部分:符号位、阶码、尾数。其中,符号位占1bit,阶码8bit,尾数23bit。

如上例78.375,故符号位为0,阶码为6,尾数为001110011。

当十进制的小数转换为二进制科学记数法的时候,如果无法用23位以内的二进制小数表示,就会出现精度损失,这就是为什么3.0会变成2.99999999。

2、浮点数阶码全0为机器0,阶码全1为无穷大。

3、浮点数求和步骤

1)零值检测,也就是参数校验,若有一个为0直接不用求和了。

2)对阶,通过调整一个数的尾数,使得两个数的阶码一样。为尽量减小精度损失,小一点的数执行右移。

3)尾数求和

4)结果规格化,将求和之后的结果调整到符合浮点数规则的状态,计算出阶码和尾码。

5)结果舍入,将对阶过程丢失的精度尽量加回来。

三、TCP基础

1、TCP三次握手

1)A->B : SYN = 1, seq = x

2)B->A : SYN = 1, ACK = 1, seq = y, ack = x + 1

3)A->B : ACK = 1, seq = x + 2, ack = y + 1

为什么是三次握手,核心点在于理解TCP建立连接成功的意思是,双方互相确认拿到了对方的初始序列号。TCP保证数据传输的完整、有序、无差错,都是依赖此序列号,后续的数据都会带一个依此序列号增长的标,作为数据校验的依据。

A将序列号发送给B,需要得到B的确认消息。同样,B将序列号发送给A,也要得到A的确认消息。这样一共是四次握手,将第二、三次握手合并,就简化为3次握手。

有第三次握手的原因是,如果第二次握手失败,B是需要重试的,所以B一定是在收到A的确认,也就是第三次握手后,才会是已建立连接的状态。

·

下面看一下包丢失的处理:

如果第一次握手失败,即A发给B的SYN失败,没有到达B,则A会周期性重传,直到收到B的确认。

如果第二次握手失败,即B给A的SYN和ACK失败,没有到达A,则B会周期性重传,直到收到A的确认。注意A并不知道没收到B的确认是由于第一次握手失败还是第二次握手失败,因此A和B的重传可能会同时进行。

如果第三次握手失败,即A给B的ACK失败,没有到达B,则分两种情况(此时A已经为ESTABLISHED,可以传输数据):

a)如果A有数据需要发送,则直接将数据会带上ACK,B收到后会状态置为ESTABLISHED,可以接收数据。

b)如果A没有数据要发送,则B周期性超时重传,直到收到A的确认,收到后B状态置为ESTABLISHED。

2、TCP四次挥手

1)A->B : FIN = 1, seq = u ,A发送释放连接报文,并停止发送数据,此时B可能有没发送完的数据。

2)B->A : ACK = 1, seq = v, ack = u+1,A收到B的确认消息,如果此消息接收失败,则A会重复尝试上一步。此时B依然可以向A发送数据。

3)  B->A :FIN = 1, ACK = 1, seq = w, ack = u+1,B发送完全部数据,向A发出释放连接报文,A收到后进入TIME_WAIT状态,经过2MSL的时间后,进入CLOSED状态。

4)A->B :ACK = 1, seq = u+1, ack = w+1, A确认收到B的释放连接请求。如果B接收此消息失败,B会重复上一步,否则B进入CLOSED状态。

之所以是四次挥手,是因为A、B都有可能在发送数据,各自需要通知对方断开连接,通知确认都需要两次。

不能合并第二、三次挥手,是因为B接收到断开通知时可能有数据没传输完。

 

之所以A要等待2MSL才关闭,是因为第四次挥手有可能失败,这时候B会超时重新重传,进行第三次挥手,A才可以反馈。

高并发机器可以调小TIME_WAIT,也就是减小MSL,这样A可以尽早释放连接。

3、TCP的流量控制和拥塞控制

https://blog.csdn.net/ss1300460973/article/details/90270123

四、字符集

字符集其实就是将二进制数据映射到字符的规范,有ASCII、GBK、UTF-8等等。

ASCII是最初美国人定义的字符集,只考虑了键盘字符等128个字符,不兼容汉字等非英文字符。

GBK即汉字内码扩展规范,是国标汉字字符集,跟ASCII不兼容。

为制定通用的编码规范,ISO推出了Unicode,Unicode兼容了所有的字符,但需要多个字节才能表示一个字符,而ASCII只需要1个字节。因此目前通用的是UTF-8可变长度编码,UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。

五、补充

1、什么是指令周期、总线周期,时钟周期,它们之间是什么关系?

指令周期:CPU取出并执行一次指令的时间。

总线周期:一次访问I/O或存储器的时间。

时钟周期:又称震荡周期,是处理操作的最小单位,一个时钟周期内CPU只会完成一个最基本动作。  

一次指令周期包含若干个总线周期,一个总线周期包含若干个时钟周期。

2、逻辑与或非有短路功能

如 a==1 && b==2,当a==1为false时,不需要判断b==2。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值