Lecture 2 - Integer
Unsigned & Signed
Byte = 8 bits. Why?为了适应字符集大小.
64 位系统和 32 位系统的一些区别是,long 类型和 pointer 在 32 位是 4 Bytes, 在 64 位是 8 Bytes.
Two's Compliment:补码,即用 \(-x_{w-1}2^{w-1}+\sum_{i=0}^{w-2}{x_i}2^i\) 来表示数.
在这个系统下,最小值 \(TMin=-2^{w-1}\),最大值 \(TMax=2^{w-1}-1\).
可以发现这个系统下,负数间的比较是自然的,并且运算,左移,算数右移也是自然的.
在表达式中,如果有 Unsigned,那么 signed 都会被 cast to unsigned. casting 的时候表现上可能会 \(\pm 2^{w}\).
truncate:截断的时候,mod \(2^w\) 意义下保持不变.
expand:扩展的时候,采用 sign expansion,用符号位填充.
Operation
随便想一下,就可以发现加法对于 two's compliment 都是很自然的,直接当 unsigned 去加去截断,就对了.
减法取反 \(+1\) 一下就是了.
在 2's compliment 下,其实 signed 和 unsigned 是本质相同的. 都是考虑在 \(\bmod 2^w\) 的群下做操作,然后 signed 的话溢出部分就是 \(-2^{w}\).
>>k 得到 \(/2^k\)
后下取整的结果. 这是因为 2's compliment 后面其实都是加法,所以不会向 0
取整.然后 arithmetic shift 需要前面填充符号位.
Memory, Pointer, Strings
使用 32-bit word size 的系统,memory 被限制在了 4GB. 使用 64-bit word size 的系统,memory 可以达到 18EB(\(18\times 10^{18}\)).
Big Endian:most significent bit 存在更前面(Sun, PPC MAC, Internet)
Little Endian:least significent bit 存在更前面(x86, ARM, Andriod iOS Windows)
将 pointer cast 成一个 unsigned char * 那么这个 pointer
就会指向一个 byte 的信息,可以用来 print byte.
string 中,每个 char 都只占一个 byte 所以显然没有 ordering issue.
int('0')=0x30
Lecture 3 - Float
IEEE Standard
single precision: 1 sign bit, k=8 exp bits, m=23 frac bits \(x_1\dots x_{23}\)
double precision: 1 sign bit, k=11 exp bits, m=52 frac bits \(x_1\dots x_{52}\)
\(s\ \{e\}\ \{x\}\)
\(bias=2^{k-1}-1\)(127 for float, 1023 for double)
\(val=(-1)^s\times 2^{E}\times M\) in the following cases (E = Exponent, M=Significand):
denormalized (exp = 00..0)
\(E=1-bias\),\(M=0.x_1\dots x_m\)
\(\{\pm0\}\cup\pm [2^{1-bias-m},2^{bias-1}(1-2^{-m})]\)
normalized (00..0 < exp < 11..1)
\(E=e-bias\),\(M=1.x_1\dots x_m\)
\(\pm[2^{1-bias},2^{bias}(2-2^{-m})]\)
special value (exp = 11..1)
\(x=[00..0]\implies \pm \infty\)
else \(\implies \text{nan}\).
\(1\):\(e=011..1\),\(x=00..0\).
operation
special case: \(\infty-\infty\),\(\infty\times 0\) produce \(\text{nan}\).
Rounding: (截断的时候)四舍五入,但是恰好为 \(...x_{m-2}x_{m-1}x_{m}|100...0\) (round bit=1, sticky bits=0)的时候取整到最近的偶数使得 LSB 为 \(0\). 注意 round 之后有可能造成 frac bits 的 overflow,需要调整 exp(可能要从 denorm 变成 norm).
Addition inverse & Monocity stands except for \(\infty\) and \(\text{nan}\).
没有结合律和分配律.
Conversion:
转成 int 的时候,直接截断(即向 \(0\) 取整)
out of range 或者 nan 或者 inf 直接变成 \(TMin\).
(32 bit) int to double 可以完全不丢精度.
int to float 的时候需要用到向偶数取整.
test