计算机系统基础(一)——程序的表示、转换与链接#
原码&移码&补码#
- 原码
- 最高位放符号位,1 表示负
定点小数,用来表示浮点数的尾数
- 移码
- 真值加上一个偏置值 bias,$bias$ 常为 2n - 1 $or$ 2n - 1 - 1 (如 $IEEE 754$)
定点整数,用来表示浮点数的阶
- 移码的本意是为了方便两个数作比较
- 补码
- 假设补码有 $n$ 位,则:x补 = 2n + x
- 数值为正数时,其值大小就是原码;为负时,其值的大小就是各位取反再加 1
补码表示带符号整数
- 补码的出现是为了解决计算机的减法运算问题
- 求补码的真值——简便求法
- 符号为 0 ,则为正数,数值部分相同
- 符号为 1,则为负数,数值各位取反,末位加 1
- 各位取反,末位加 1 简便做法:从后往前看,找到第一个 1 ,将它前面的所有位取反
浮点数——$IEEE754$标准#
- 数符 + 阶码 + 尾数
- Float $1 + 8 + 23$
- $SP$:$(-1)$s $$ $(1 + Significand)$ $$ $2$(Exponent - 127)
- Double $1 + 11 + 52$
- $DP$:$(-1)$s $$ $(1 + Significand)$ $$ $2$(Exponent - 1023)
- 数符 $Sign bit$
- 阶码 $Exponent$
- 规格化阶码范围为 $0000 0001(-126) —— 1111 1110(127)$ $(single)$
- $bias$ 为 $127(single)$ $1023(double)$
- 规格化阶范围为 $1——254$$(single)$
- 全 $0$ 和全 $1$ 用来表示特殊值
- 为避免混淆,用阶码表示阶的编码,用阶或指数表示阶码的值
- 尾数 $Significand$
- 规格化尾数最高位总是 $1$,所以隐含表示,省 $1$ 位,小数点前总是 $1$
- 特殊数的表示$(single)$
- $0$
- $阶码:all$ $zeros$
- $尾数:all$ $zeros$
- $+0:0$ $00000000$ $00000000000000000000000$
- $-0:1$ $00000000$ $00000000000000000000000$
- $∞$
- $阶码:all$ $ones$
- $尾数:all$ $zeros$
- $+∞:0$ $11111111$ $00000000000000000000000$
- $-∞:1$ $11111111$ $00000000000000000000000$
- 浮点数除以 $0$ 的结果是 $∞$,而不是溢出异常(整数除以 $0$ 为异常)
- $NaN$ ($Not$ $a$ $Number$)
- $阶码:all$ $ones$
- $尾数:nonzeros$
- 可帮助调试程序
- 非规格化数 $Denorms$
- $阶码:all$ $zeros$
- $尾数:nonzeros$
- 用于表示 $0$ 与规格化数间的$Gap$
- $SP$:$(-1)$s $$ $(0.xxxx…xxx)$ $$ $2$-126
- 为了让非规格化单精度浮点数能够平缓过渡到规格化单精度浮点数,所以取 $2$-126
- 当输入数据为不可表示数时,机器将其转换为最邻近的可表示数
汉字内码&ASCII码#
- ASCII码为 7 位编码
- Ex:汉字 “$大$” 在码表中位于第 $20$ 行、第 $83$ 列。因此区位码为 $0010100$ $1010011$,在区、位码上各加 $32$ 得到两个字节编码(GB2312国标码),即 $00110100$ $01110011B$ $=$ $3473H$。前面的 $34 H$ 和 字符 $4$ 的 $ACSII$ 的最高位相同,后面的 $73H$ 和字符 $s$ 的 $ACSII$ 码相同。但是,将每个字节的最高位各设为 $1$ 后,就得到其内码: $B4F3H$ ($0110100$ $11110011B$),因而不会和 $ASCII$ 码混淆
逻辑电路#
- 异或:$n$ 个数做异或运算,若有奇数个 $1$ ,则输出 $1$
推荐阅读#