数据的表示和运算
数据的表示和运算¶
数制与编码¶
进位计算制¶
- 除基取余:每次对剩余商进行除以进制数的操作,取余数,一直循环,直到商为0,得到的结果是从低位到高位。

- 乘基取整:每次对剩余积进行乘进制数的操作,取整数,一直循环,直到小数部分为0(或达到所需精度,在某些情况下小数部分永远无法为0,那就取到一段循环),得到的结果是从高位到低位。


定点数的编码表示¶
- 定点数:小数点位置固定。
- 浮点数:小数点为位置不固定。
- 尾数:用来表示整数或小数的数值部分的二进制数。
- 原码:用尾数表示真值的绝对值,符号位“0/1”对应“正/负”。
-
反码:
-
若符号位为0,则反码与原码相同
-
若符号位位1,则反码为原码数值位全部取反
-
补码:
-
正数的补码 == 原码
- 负数的补码 == 反码末位 + 1(要考虑进位)
- 因为补码的定点整数+0、-0用补码表示都是+0(-0取反后加一后最高位的1因为超过机器字长所以舍弃了)因此没有了-0,但多了一个最小负数,所以我们规定,此处以机器字长位8位演示:补码1,0000000为-2^7^,若机器字长为n + 1位就为-2^n^。同理,补码的定点小数+0和-0同样都是+0,因此同样规定:补码1.0000000为-1,若机器字长为n + 1位同样也为-1。
-
已知负数补码通过尾数取反再末位+1的操作就可以得到原码,相当于求补码的补码。
-
移码:在补码的基础上符号位取反。(PS:移码只能用于表示整数)
- 技巧:由[x]补快速求出[-x]补的方法
- 符号位、数值位全部取反后末位+1
- 或者从右往左找到第一个1,第一个1及其右边的所有数不变,右边的全部取反(上的推论)
- 同理若是求一个数的补码也可以用这个办法,只不过符号位不取反

可以看出,随着真值增大,真值对应的移码也随之增大,因此移码很方便用来比较大小。事实上,移码正是通过给真值加上一个固定的偏置(bias),使得所有数值(包括负数)都映射到非负的二进制数,且保持原来的大小顺序。因此,移码可以直接按无符号数比较大小,非常适合于浮点数的阶码表示。


各种码的作用¶
由于原码在运算时需要根据首位数字判断正负,选择加法器还是减法器,这需要硬件的升级,开销大,因此,就发明了补数。同模的数在加法中可以替换(加完后要取模),用加法替代减法,完美解决这一问题。

#### 零扩展、符号扩展

运算方法和运算电路¶
基础知识¶
逻辑门电路¶
- 异或经常被用于实现奇偶校验、二进制加法。因为当一连串异或操作中,一共有偶数个1,结果必为0;一共有奇数个1,结果必为1。



多路选择器、三态门¶

加法器¶


- OF:Overflow Flag
- SF:Sign Flag
- ZF:Zero Flag
- CF:Carry Flag

算数逻辑单元ALU¶
- ALU:Arithmetic and Logic Unit
- ALU是运算器的核心,而加法器是ALU的核心
- PSW(Program Status Word程序状态字寄存器) == FG(Flag Register)

加法减法¶
定点数的移位运算¶
- 对于带符号整数算术左移溢出的理解:
- 若不溢出,我们以十进制的角度来看,应该符号不变,也就是说,符号变了,就代表了溢出,因此左移前最高位(也就是符号位)和左移后最高位如果不一致,就代表符号变了,也就是溢出了。

定点数的加减运算¶
- 对于方法一:只有当被加数、加数、和的符号位分别位0、0、1或1、1、0时才代表发生了溢出。
- 对于方法三:若符号位最高位为0,次高位为1,说明本该为正数,相加完为负数,说明发生了上溢;若符号位最高位为1,次高位为0,说明本该为负数,相加完为正数,说明发生了下溢
- 双符号位在存储时同样也只存储一个符号位,只是会在操作前进行复制

无符号数的加减运算¶
- 在模M的情况下减去一个数相当于加上这个数的补数,设该数为a,则它的补数为M - a。而求补码就是在求补数。
- 对于无符号减法是看最高位进位是否为0的理解:若A - B不溢出,那么A一大于等于 B,A的补数一定小于等于B的补数,而减法是加上B的补数,因此A加上一个比A的补数还大或等的数一定会发生溢出,此时最高位进位应该是1。同理,若A - B溢出,那么A一定小于 B的补数,A的补数一定大于B,而减法是加上B的补数,因此A加上一个比A的补数还小的数一定不会发生溢出,此时最高位进位应该是0。

补码加减运算电路¶
- 切记!!!Cin是参与运算的!!!



- 对于为什么CF是Cout ^ Cin:我们知道,无符号加减法都关注最高位进位,加法1溢出,减法0溢出;同时观察
Figure21,Sub信号和Cin是相连的,若Sub为0,代表加法,若此时Cout为1表示发生溢出;若Sub为1,代表减法,若此时Cout为0表示发生溢出。
乘法除法¶
无符号整数的乘法运算原理¶
- 无符号乘法判断是否溢出使用的OF,无符号加减法使用CF,但若是发生溢出了,CF也会被置为1,只不过程序员使用时一般使用OF进行判断。


ps:写使能(Write Enable)
带符号整数的乘法运算原理¶
- 布斯(Booth)乘法


浮点数的表示与运算¶
浮点数的表示¶
IEEE 754浮点数的表示¶
- 尾数中存储的是原码。
- 规格化要求尾数绝对值在 [0.5,1) 之间,即小数点后第一位必须是 1。在IEEE754中因为隐含了一位1所以是 [1, 2)





浮点数的表示范围、几种特殊状态¶
- IEEE754规定0 / 0是NaN
- 非零数值除以0是正无穷或负无穷

ps:NaN:Not a Number

此处的最大的非规格化数可以理解就是最小的规格化数减去一个最小的非规格化的长度。

浮点数的加减运算¶
加减运算¶

舍入问题¶
- 浮点数舍入的情况有两种:对阶、右规格化。
- 舍入不一定产生误差。

溢出问题¶


数据的存储和排列¶


习题笔记¶
- 无符号整数参与运算时,若参与运算的别的数据与他 “同级” (例如
int与unsigned int)那么这个数据会被强制转化为无符号类型。 - 如果另一个操作数的等级更高(例如
long long与unsigned int),则unsigned int可能会被提升为long long(而不是反过来),此时无符号不占主导。 -
如果另一个操作数的等级更低(例如
short),则先进行整型提升(扩充位数),通常变为int或unsigned int,然后再按上述规则处理。 -
阵列乘法器是一种快速乘法器,它采用硬件叠加的方式,所有部分积同时产生并组成一个阵列,再运用多操作数相加,就能得到最终的积,因此最快可在一个始终周期内完成一条乘运算指令。
-
长度相同、格式相同的两种浮点数,假设前者基数大,后者基数小,其他规定均相同,则前者可表示的范围大,精度低(离散化程度提高)。
-
舍入是浮点数的概念,定点数没有舍入的概念。
-
计算机中的信息按边界对齐方式存储的含义是信息单元的存储地址是其字节长度的整数倍。
-
结构体中的边界对齐:成员起始地址 = 自身类型大小整数倍,不满足则在前一成员后插入最少填充字节。插填充字节, 结构体总长为最大成员的整数倍。
-
快速看出地址是否是某一个数x的倍数:对于对齐粒度 N=2^k^(计算机对齐永远是 2 的幂):
十六进制地址只需看最后 1 位,若该数字能整除 N,则整体地址是 N 的倍数。
- ALUBsrc( ALU B Source)是CPU 数据通路里 1 位控制信号。用来专门选 ALU 第二个操作数:0 选寄存器值,1 选符号扩展立即数