CSAPP
第一章
程序运行流程:
首先我们按下./hello ,字符串从键盘被读取 shell会将读取到的字符串逐一加载到寄存器,处理器会把hello字符串放到内存中。(注意此处不可以DMA直接读取到内存,内存只是存储空间,不放在寄存器里面program count无法指向程序)按下回车键,指令结束,shell会通过一系列指令加载可执行文件hello。这些指令会将hello中的数据和指令从磁盘督导内存而不经过CPU,这既是DMA技术。当hello中的数据和指令到达内存时,处理器就开始执行指令。CPU会将hello world\n 这个字符串复制到寄存器文件,然后再从寄存器文件复制到显示设备。
第二章 信息的表示和存储
2.1 信息存储
gcc -m32 -o hello32 hello.c #编译32位程序
gcc -m64 -o hello64 hello.c #编译64位程序
if(a && 5/a) //先判断a是否为0 如果是0,则不再执行后续
算术右移与逻辑右移不同之处:算术右移操作数最高位为1时,左端补1 逻辑右移直接补0
一般有符号数算术右移 无符号数逻辑右移
2.2 整数的表示
二进制补码 补码是首位是1则为负,首位为0即是正数
- 正数的补码与原码相同。
- 负数的补码是对原码(符号位除外)按位取反后加1得到的。
2.3 整数的运算-remain
正溢出实际上是一种假溢出,因为没有舍弃位,而是最高位由0变为1,产生了负权重
负溢出是真正意义的溢出,最高位产生溢出,而被丢弃,使得负权重丢失,让结果变为正数
加入偏置后再右移 偏置为((1<<k )-1)接口得到向0舍入的结果
2.4 浮点数
阶码(Exponent)
阶码用于表示浮点数中指数部分的值。它决定了尾数的小数点应该向左或向右移动多少位,从而表示出不同的数值范围。在IEEE 754标准中,阶码通常采用偏移(或称为偏置)的方式来表示,这是为了使得所有的指数都有一个正的表示,包括负数。偏移值通常是2e−1−1,其中e是阶码的位数。
例如,在一个单精度浮点数(32位)中,阶码占据了其中的8位(包括一个符号位),因此偏移值为27−1=127。如果一个单精度浮点数的阶码字段为128(二进制为10000000),那么实际的指数值为128−127=1,表示小数点向右移动1位。
尾数(Mantissa 或 Significand)
尾数(或称为有效数字)是浮点数中表示数值精度(或大小)的部分。它紧跟在阶码之后,包含了浮点数中除去隐含的整数位(在IEEE 754标准中,对于非零的规格化浮点数,尾数前会隐含一个1,这个1不会存储在尾数字段中)之外的所有位。尾数可以是整数也可以是分数,但在计算机中,它们通常以二进制形式存储。
在IEEE 754标准中,尾数部分还包括了一个隐含的二进制点,这意味着尾数实际上是一个二进制小数,而不仅仅是整数或二进制数的集合。这种设计允许浮点数以更高的精度来表示小数。
浮点数结果不具有整数相关性