数据的表示和计算
2.1 数制与编码
2.1.1 进位计数制及其相互转换
在计算机内部,所有信息都是用二进制编码的,原因如下:
- 二进制只有两种状态,易于用物理器件实现(如高低电平)。
- 二进制与逻辑值“真/假”对应,便于逻辑运算。
- 二进制编码和运算规则简单,可通过逻辑门电路方便实现。
常用进位计数制
- 二进制:基数为2,数码0/1,逢二进一。后缀B(Binary)。
- 八进制:基数为8,数码0~7,逢八进一。后缀O(Octal)。
- 十六进制:基数为16,数码0
9、AF,逢十六进一。后缀H(Hexadecimal)或前缀0x。 - 十进制:基数为10,数码0~9,逢十进一。后缀D可省略。
进制转换
1. 二进制 ↔ 八进制/十六进制
- 二进制转八进制:从小数点开始,整数部分向左,小数部分向右,每3位一组(不足补0),每组转换为1位八进制数。
- 二进制转十六进制:每4位一组转换为1位十六进制数。
- 反向转换:每位八进制(十六进制) 转换为3位(4位)二进制。
2. 任意进制 → 十进制
按权展开相加法:将各位数码与位权相乘后求和。
例:
3. 十进制 → 任意进制
- 整数部分:除基取余法。除以基数,取余数为当前位(从低位到高位),商继续除,直到商为0。
- 小数部分:乘基取整法。乘以基数,取整数部分为当前位(从高位到低位),小数部分继续乘,直到积为1.0或达到精度。
注意:十进制小数不一定能用二进制精确表示(如0.3),但任意二进制小数都可用十进制精确表示。
2.1.2 定点数的编码表示
真值和机器数
- 真值:带正负号的数值(如+15,-8)。
- 机器数:将符号数字化(0表示正,1表示负)后的编码。常用原码、补码、反码、移码。
定点表示
- 定点小数:小数点固定在符号位之后、数值最高位之前。表示纯小数。
- 定点整数:小数点固定在数值最低位之后。表示纯整数。
原码表示
- 最高位为符号位,其余位表示绝对值。
- 定义:(整数,n+1位含符号)
- 表示范围:,0有+0和-0两种表示。
- 优点:直观,乘除运算简单;缺点:加减运算复杂,0不唯一。
补码表示
- 正数补码与原码相同;负数补码等于模减去绝对值(或取反加1)。
- 定义:(整数,模)
- 表示范围:,比原码多表示一个最小负数。0的表示唯一。
- 优点:符号位与数值位一起参与运算,减法可转为加法。
- 补码与真值转换:正数不变;负数:符号位1,数值位取反加1。反之,补码符号位为1时,数值位取反加1得真值绝对值。
- 变形补码(模4补码):双符号位,00正,11负,用于ALU中检测溢出。
反码表示
- 正数反码与原码相同;负数反码为原码符号位不变,数值位取反。
- 表示范围同原码,0有+0和-0。很少用于运算,主要作为中间表示。
移码表示
- 在补码基础上将符号位取反(或加偏移量)。常用于表示浮点数的阶码。
- 移码与补码数值部分相同,符号位相反。0的移码唯一。
2.1.3 整数的表示
计算机中的有符号整数都用补码表示。n位有符号整数的表示范围:。
无符号整数(unsigned)全部二进制位均为数值位,表示范围:。
2.1.4 C语言中的整数类型及类型转换
C语言整型数据按补码形式存储,char默认无符号,short/int/long默认有符号。
有符号数与无符号数的转换
- 强制类型转换保持位值不变,仅改变解释方式。
例:short x = -4321; unsigned short y = (unsigned short)x; 位值相同,但y的值变为61215。 - 若同时有无符号数和有符号数参与运算,C标准规定按无符号数进行运算。
不同字长整数之间的转换
- 大字长 → 小字长:直接截断高位部分,低位保留。
- 小字长 → 大字长:无符号数进行零扩展(高位补0);有符号数进行符号扩展(高位补符号位)。
2.1.5 常见考点
- 补码表示范围、补码与真值互转。
- 有符号/无符号转换后的数值变化。
- 不同字长转换时的扩展方式。
2.2 运算方法和运算电路
2.2.1 基本运算部件
带标志加法器
- 在无符号数加法器基础上增加逻辑门,生成标志信息:
- OF(溢出标志) = (符号位进位与最高数值位进位的异或),用于有符号数溢出判断。
- SF(符号标志) = 结果的最高位 。
- ZF(零标志) = 1当且仅当结果为0。
- CF(进位/借位标志) = (减法时Sub=1,CF = Sub⊕Cout),用于无符号数溢出判断。
算术逻辑单元(ALU)
- ALU核心是带标志加法器,还能执行与、或、非等逻辑运算。ALUop控制操作类型。
一位ALU结构:通过多路选择器选择输出加法、与、或等结果。