学习笔记
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)。
在二进制补码表示法中,一个数的负数可以通过以下步骤获得:
- 取反(0变1,1变0)。
- 加1。
让我们尝试取得Tmin(10000000)的负数:
- 取反得到 01111111。
- 加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
%rdi | 0x120 |
%rsi | 0x100 |
%rax | |
%rdx |
123 | 0x120 |
0x118 | |
… | |
456 | 0x100 |
swap:
- movq (%rdi), %rax # t0 = *xp
- movq (%rsi), %rdx # t1 = *yp
- movq %rdx, (%rdi) # *xp = t1
- movq %rax, (%rsi) # *yp = t0
表格变化过程:
%rdi | 0x120 |
%rsi | 0x100 |
%rax | 123 |
%rdx | 456 |
123 | 0x120 |
0x118 | |
… | |
456 | 0x100 |
%rdi | 0x120 |
%rsi | 0x100 |
%rax | 123 |
%rdx | 456 |
456 | 0x120 |
0x118 | |
… | |
123 | 0x100 |
ll Control
bomb lab