深入理解计算机系统读书笔记
深入理解计算机系统读书笔记
前言
我是一名刚入职半年的码农,本硕非CS专业,自知基础薄弱。但我是一个有远大抱负的人,想在这个领域有所建树,于是决定先从这本书开始作为起点,文章会对我认为的重点知识做盘点,如果我有疑惑的地方,也会写出来,请各位大神指摘。
信息的表示和处理
十六进制、十进制和二进制转换
二进制转十六进制:从低位到高位,每四位转成16进制,16进制转2进制则相反
十进制转十六进制:将十进制x转换为16进制,可以反复的用16除x,得到商q和余数r
原理如下,对于十进制数:
其中表示小于16的上一次除法的商,可以写成下式:
展开后,直到消掉,表达式可写为:
根据定义,十六进制表达式为
字、大端与小端
每台计算机都有一个字长,比如我们通常说的32位机器或64位机器,这个32和64就是字长。字长决定的最重要的就是可访问内存的大小,虚拟地址的范围是到,比如32位字长的机器,就限定了最大字长约4GB.
大小端分别指字节在内存中存储的顺序,比如对于16进制数,按照存储顺序:
大端:01 23 45 67
小端:67 45 23 01
整数表示
无符号和有符号
假设某数据类型有位,,则
无符号表示:
有符号(补码)表示:
除了补码外,还可以用反码、原码表示有符号的整数,但是他们对0有两种不同的编码。其实无论何种编码从位级上看都是相同的,不同的是表达式对它的解释。
有符号数与无符号数之间的转换
无符号转有符号:设无符号的数值为,若最高位是0,为原值;最高位是1,表达式为
有符号转无符号:设有符号的数值为,若最高位是0,为原值;最高位是1,表达式为
整数运算
无符号加法
假设某数据类型有位,则表示范围是0到2w-1,相加的范围是0到22w-2,因此可能产生溢出,现行的策略是截取高位,相当于对结果模运算2w
有符号(补码)加法
假设某数据类型有位,则表示范围是-2w-1到2w-1-1,则相加的范围是-2w到2w-2,因此即可能产生正溢出,也可能产生负溢出,且产生正溢出时两个数均为负,正溢出时两个数均为正。
但由于两个数的w位补码之和与无符合之和有相同的位级表示,因此我们可以用无符号的解释来做加法,并截取高w位,再转换成补码。
设两个补码数为x,y,则有,根据定义,该式等价为:
…剩下的推导有部分没有理清楚,待续,直接上结论:
乘法、除法
无符号:w位无符号的乘法可能会溢出,对结果模运算2w即可
有符号: 对于无符号和补码乘法来说,位级的表示都是一样的。因此
乘以常数:常数可以用移位运算和加减法,再做乘法,因为乘法指令相对较慢。
除以2的幂:对于无符号数,逻辑右移k和除以2k有相同的效果;对于补码数,在移位之前需要加上一个偏置值,c表达式为:
(x<0?(x+(1<<k)-1:x)>>k
浮点数
IEEE浮点表示
IEEE浮点标准用的形式来表示一个数,s表示这个数的正(0)负(1)。
M是一个二进制小数。对于规格化的值,M=1+f,f是小数位对应的值,E=e-bias,Bias的值为,e的值为指数字段的值;对于非规格化的值,E=1-bias,M=f。
对于单精度,指数位是8,小数位是23;对于双精度,指数位是11,小数位是52。
特殊值:当指数为全为1时出现,具体不表了。
舍入
这里主要提一下向偶数舍入,对于非中间的值,跟接近哪边则向哪边舍入。举例,舍入到小数点后2位的问题,10.00011则舍入位10.00,10.00110则摄入到10.01,进1位即可。对于中间的数值,最低为是0直接舍去;最低位是1则进一位,比如10.10100舍入成10.10(舍1位),而10.11100则舍入为11.00(进1位)。
上一篇: Qt d指针q指针