Toda mi ambición es ser libre toda mi vida.
【CSAPP】学习笔记
【CSAPP】学习笔记

【CSAPP】学习笔记

学习笔记

01 前言

只是记录一些感觉自己记不太清楚的东西,并不是全部课的内容。

02 Bits Bytes and Integers

重点提示无符号 vs 有符号,整型溢出问题 ,比特操作 ( &, |, ~, ^ ) vs 逻辑操作 (&&, ||, !)

感觉408大多都学了,所以也没怎么记笔记。

听课的时候认为有趣的点

一个对补码的理解:
当六位二进制数每位数都是1的时候,111111 = -16+8+4+2+1 = -1,这也就是 -1 的补码表示形式。

一个关于无符号整数有意思的例子:
老师提出了这样一个例子,这个循环会无限循环下去,为啥会有这样的情况是因为,i是无符号数,在i减少到0的时候,再减去1,就会变成11111111111111111111111111111111(32),也就是下面的4294967295,又会重新开始循环。

#include <stdio.h>
#include <stdlib.h>
int main(){
    int count = 0;
    for (unsigned i = 10; i >= 0; i--)
    {
        count ++;
        printf("%u\n", i);
        if(count > 20){
            return -1;
        }
    }
    return 0;
}

03 Bits, Bytes, and Integers cont

正溢出:正+正=负
负溢出:负+负=正

有趣的补码乘法

假如有两个数a = -3(1101), b = -4(1100),他们的无符号表现形式的值为a = 13, b = 12
13×12 = 156(1001 1100)

后面的1100就是-3 x -4的无符号结果

一个比较

为什么x>y,-x<-y,这一句话不一定成立

对于二进制补码表示法中的整数来说,最小值(Tmin)的负数是其本身。

为了明确说明这一点,我们考虑一个典型的整数表示:二进制补码。在此系统中,整数有一个最大值和一个最小值。以8位整数为例:

  • 最大值(Tmax)是 01111111(十进制的127)。
  • 最小值(Tmin)是 10000000(十进制的-128)。

在二进制补码表示法中,一个数的负数可以通过以下步骤获得:

  1. 取反(0变1,1变0)。
  2. 加1。

让我们尝试取得Tmin(10000000)的负数:

  1. 取反得到 01111111。
  2. 加1得到 10000000。

你会发现这还是Tmin。因此,Tmin的负数是其本身。

04 floating point

浮点数规格:(-1)^S M 2^E,S决定正负,M是介于1-2的小数,E最大应该是最高位

规格化

比如对于单精度浮点数1 8 23(s exp frac):exp不能全为1和0

  • 指数域:E = exp – bias。8–>2^(8-1),bias是128-1=127。(exp: 1…254, E: -126…127)
    • 这里exp的值要一直作为一个数,所以引出了bias这个东西
  • 尾数域:
    • 最小全为0:1.0000…
    • 最大全为1:1.1111…

比如1521310转化为二进制浮点数:

  • 1521310 = 111011011011012 = 1.11011011011012 x 2^13
  • M = 1.11011011011012
    • frac = 1101101101101
  • E = 13
    • bias = 127
    • exp = 13+127 = 140 = 1000110022
  • Result = 0 10001100 11011011011010000000000

区间:

0 <= EXP <= 255(11111110)

-127 <= E <= 128

非规格化

因为M总是有一个隐含的1限制着我们不可能等于0,非规格化浮点数里面,M的值就等于frac的值,没有哪个1了

特殊值

  • 无穷大:exp = 1…11, frac = 0 … 00
  • NaN:exp = 1…11, frac ≠ 0 … 00

总结一下上面

来欣赏一下平滑过渡

05 Machine Level Programming

l Basics

PC: Program counter

  • Address of next instruction
  • RIP(x86-64)

编译c语言文件的过程:

The name of registers

operation

1. movq

不能从一个内存复制到另一个内存地址,只能先复制到一个寄存器,再从寄存器复制到mem

e.g: swap

%rdi0x120
%rsi0x100
%rax
%rdx
Registers
1230x120
0x118
4560x100
Memory Address

swap:

  • movq (%rdi), %rax # t0 = *xp
  • movq (%rsi), %rdx # t1 = *yp
  • movq %rdx, (%rdi) # *xp = t1
  • movq %rax, (%rsi) # *yp = t0

表格变化过程:

%rdi0x120
%rsi0x100
%rax123
%rdx456
Registers
1230x120
0x118
4560x100
Memory Address
%rdi0x120
%rsi0x100
%rax123
%rdx456
Registers
4560x120
0x118
1230x100
Memory Address

ll Control

bomb lab

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注