CSAPP(一)
in 技术 with 0 comment

CSAPP(一)

in 技术 with 0 comment

csapp3e-cover

第一章 计算机系统漫游

​ 一个总体观,计算机系统是由软件和硬件组成的,共同来运行应用程序,程序开始是ASCII文本,然后被编译器和链接器翻译成二进制可执行文件。

第二章 信息的表示和处理

2.1 信息存储

信息的位表示是最底层的呈现,毕竟世界上只有10种人,一种是懂二进制的,一种是不懂二进制的对吧。主要了解清楚无符号编码、补码编码、浮点数编码以及对应的一些位运算符和逻辑运算符。

2.1.1 十六进制表示法

十六进制表示法

2.1.2 字数据大小

每台计算机都有一个字长,指明指针数据的标称大小。字长决定了虚拟地址空间的大小,对于一个字长为$w$位的机器,虚拟地址的范围就是$0~2^w -1$,程序最多访问$2^w$个字节。32位字长限制虚拟地址空间为4GB,64位字长则有16EB,大约$1.84x10^19$

image-20201027101700032

2.1.3 寻址和字节顺序

image-20201027103118448

2.1.6 布尔代数

image-20201027104151672

2.1.7 C语言中的位级运算

image-20201027104343815

2.1.8 C语言中的逻辑运算

image-20201027104555202

2.1.9 C语言中的移位运算

image-20201027105239407

2.2 整数表示

2.2.1 整型数据类型

image-20201027105612625

image-20201027105808035

2.2.2 无符号数的编码(8421码)

image-20201027114407225

2.2.3 补码编码[two’s-complement](大多数机器都对整数使用补码编码)

image-20201027115126367

image-20201027115202442

举一个:chestnut::在short类型下(范围是-32768~32767)

    • $12345$的补码表示为[0011000000111001],即0x3039
    • $-12345$的补码表示为 [1100111111000111], 即0xcfc7
    • 取相反数的技巧,各位取反+1 -x == (~x+1)
    • short类型下表示不了53191,unsigned short可以,位表示为 [1100111111000111],与补码中的$-12345$一样,可以看出有相同的位表示但是编码方式不同所表示的含义也会不同
    • 同时 $12345+53191=65536=2^{16}$
  • 2.2.4 有符号数和无符号数之间的转换

    image-20201027163936562

    image-20201027164027848

    2.2.5 C语言中的有符号数和无符号数

    image-20201027165054428

    2.2.6 扩展一个数字的位表示

    2.2.7 截断数字

    2.2.8 几个有符号数和无符号数之前隐式强制类型转换导致的漏洞

    1. image-20201027170015314

    代码第2行中 由于使用了unsigned类型,所以当length为0时,计算length-1 会得到UMax,会导致数组越界。改为int即可

    1. image-20201027171102559

    代码7行的位置,size_t使用的是unsigned int(32) 及 unsigned int(64),当它为负的时候,会变为一个非常大的正整数

    2.3 整数运算

    2.3.1 无符号加法

    image-20201028185419598

    2.3.2 补码加法

    image-20201028190650032

    2.3.3 补码的非

    2.3.4 无符号乘法

    2.3.5 补码乘法

    image-20201028192913078

    2.3.6 乘以常数

    2.3.7 除以2的幂

    image-20201028194651448

    image-20201028195138355

    image-20201028195348797

    2.4 浮点数

    2.4.1 二进制小数

    2.4.2 IEEE浮点表示(:star:)

    符号(sign)s表示数的正负

    尾数(significand)M是一个二进制小数,范围是 $1~2-\varepsilon$

    阶码(exponent)E的作用是对浮点加权

    在单精度float中,s=1位,k=8位,n=23位。得到32位的表示

    在双精度double中,s=1位,k=11位,n=52位,得到64位的表示

    image-20201028201847381

    image-20201028202008891

    1. 如果exp不为全1或全0。规格化的值,阶码的值是 $E=e-127(单精度)$,尾数M=1+f(隐含的1开头),即表示f的时候是一个0到1的小数值,但实际上表示的是一个1到2之间的数字。
    2. 当exp全部都为0。非规格化的值,阶码$E = 1 - 127$,尾数的值是$M=f$,无隐含的开头1。非规格化数有两个用途,一个是表示数值0的方法,因为使用规格化数的时候,有隐含的开头1,尾数M表示的值总是大于1的。另一个用途就是表示那些非常接近0的数。

      • $+0.0$ 就是所有位都是0。
      • $-0.0$ 是符号位s为1,其他所有位都是0。
    3. 当exp全为1时,分两种情况:

      • 小数域f全为0时,表示无穷大,且$s=0$表示$+∞$,$s\neq$0表示$-∞$
      • 小数域f全为1时,表示NaN(Not a Number)

    2.4.3 数字示例

    image-20201028204203522

    image-20201028211447791

    2.4.4 舍入

    image-20201028212357346

    2.4.5 浮点运算

    Comments are closed.