ICS-数据类型

2025-09-15

ICS

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