随笔分类 - 大学计算机课程
摘要:目录P188 P188 这一段是在说强制转换就是向零取证,由于d是double,u是long,所以两者的二进制表示很不一样(想一下1.5和1的二进制表示);而联合是不会改变二进制表示的,所以当d=1.0的时候,u=4607182418800017408
阅读全文
摘要:目录P198P199P201 P198 解释一下栈随机化 程序执行的时候会分配栈帧,如果使用随机化,就是在main函数前随机分配一段内存不适用,这个时候就没办法预测返回地址了,如下 P199 解释一下空操作雪橇: 假设有一个机器,攻击者可以向机器中输入一个字符串,而且攻击者知道机器在接收字符串之后的
阅读全文
摘要:目录P195P197 P195 gets函数体中有一个语句*dest++:注意回忆一下,这里的++是后自增,所以先会解引用,然后把c的值赋值,然后再将指针加一;如果写成(*dest)++,那么就是先解引用,并且让dest指向的值后自增(而不是像前面一样让dest后自增) 还有一些函数与gets一样
阅读全文
摘要:这里补充一下课上讲的关于内存的东西 虽然x86-64理论上的内存大小为\(2^{64}\),但实际上只有\(2^{47}\),于是内存的起始位置为0x00007fffffffffff(注意内存的地址是逐渐减小的,所以这是起始地址而不是结束地址;参考栈) Stack 如图所示,运行时栈 大小不能超过8
阅读全文
摘要:目录P189 P189 这里说的对齐的原因就是大部分机器一次性读取的字节是多个(而不是一个字节),如果不对齐的话一个数据就有可能跨越两个读取区域。x86-64可以正常工作,但是有些机器不可以;无论如何效率都会下降
阅读全文
摘要:来看一个比较复杂的例子 上面的结构体定义中应该是a[4]而不是a[3]
阅读全文
摘要:目录P178 P178 补充一下指针的知识 在C语言中,二维数组 A 的 *A 和 **A 的含义可以通过数组与指针的关系来理解。以下是详细解释: 1. 二维数组的内存布局 假设定义了一个二维数组: int A[3][2] = {{1, 2}, {3, 4}, {5, 6}}; 内存中按行优先顺序连
阅读全文
摘要:目录P176 P176 书上已经说了声明的效果(注意如果声明指针的话,只是分配了指针的空间,而指针指向的空间是没有直接被分配的,我们需要手动指定),那么下面的PPT可以对照一下 可以给一个负的索引,地址的计算规则是一样的,也就是往前找一个地址(其实给多小的数和多大的数都无所谓,C没有边界检查,可能会
阅读全文
摘要:目录P166 P166 讲一下为什么%rsp会变成0x7f...838:注意到0x7f...840-0x7f...838=0x8,也就是八个字节,而x86-64的一个地址的标号是八个字节,所以相当于刚好存储了一个地址,也就是从函数返回之后要执行的指令所在的地址
阅读全文
摘要:目录P164 P164 释放只是增加指针而已,原来的数据仍然在内存里面但是不是栈的一部分了 栈帧是用于特定call指令的一个内存块,也一个call指令的时候,会调用某一个函数,如果寄存器无法存储下所有这个函数的开始信息(见图3-25的文字),那么就会在栈上为这次调用分配额外的信息,这一部分存储额外信
阅读全文
摘要:目录P127 P127 简单来说,栈就是一块连续的内存区域,传递信息,分配数据,管理调用等 push的源操作数可以是寄存器,内存和立即数,pop的目的必须是寄存器
阅读全文
摘要:补充一下for循环在O1下的行为 可以看到,没有用的保护代码是会被编译器移除的
阅读全文
摘要:目录P146 P146 解释一下这个流水线的含义(结合视频的理解):一条指令的处理有多个步骤,而不同指令的同一步骤不可以并行(因为对于这个步骤来说只有一个“工人”),同一指令的不同步骤不可以并行(因为必须按照顺序作业),但是不同指令的有些不同步骤可以并行(比如从内存中读取这条命令就不需要知道前面命令
阅读全文
摘要:leaq的出现就是用一次操作来进行简单的加乘计算的,这样就不用用很多条操作去完成了。就把leaq理解成去读寄存器的值,而不是寄存器的地址,或者寄存器所引用的地址,或者寄存器所引用的地址存储的值。而其他操作加上括号还是代表引用内存 来补充一个例子,下面的例子是正确的,好好看
阅读全文
摘要:目录P86 P86 解释一下为什么int转double可以很精确:注意到阶码的定义是\(2^E\),而\(E\)的范围远比\(32\)大;int类进行规格化之后,显然阶码是不会超过\(32\)的;同时double的尾数位也比\(32\)大,所以可以精确表示
阅读全文
摘要:目录补充P85 补充 补充一下比较的操作 首先把NaN排除在外 然后按照下列的步骤比较 首先考虑符号位(注意\(+0=-0\)) 然后直接将剩下的所有二进制位按照无符号整数比较即可 P85 然后正文的意思就是说浮点数在计算的时候,首先假设有无限多的精度位计算出一个精确的结果,然后使用舍入技术舍入即可
阅读全文
摘要:目录P79 P79 规格化 既然\(E\)有正有负,为什么不用补码表示而是要采用偏置(\(E=e-bias\))的形式表示呢?因为这个样子我们可以直接将\(exp\)看做无符号整数,比较的时候直接按照无符号整数比较就很简单了 规格化的含义就是大家都约定\(M=1+f\) 来看一个例子:\(15213
阅读全文
摘要:来看另外两个视频中的例子 一: for(unsigned i = n - 1; i >= 0; i --) { ... } 显然上面的函数会无限循环。对于下面的函数 for(int i = n - 1; i - sizeof(char) >= 0; i --) { ... } 实际上也是无限循环。注
阅读全文

浙公网安备 33010602011771号