数制转换
将十进制转换为任意进制数
基数乘除法
对整数部分采用{c1: 除基取余}法
先余为{c2: 低}, 后余为{c2: 高}
算到整数部分为 0 为止
对小数部分采用{c3: 乘基取整}法
先整为{c4: 高}, 后整为{c4: 低}
算到小数部分为 0 为止
Q: 任意一个十进制小数都可以用二进制小数表示吗?
A: 不行
任何十进制的小数都可以用二进制表示
但不是所有的二进制小数都可以用十进制表示
真值与机器数
不论真值为正数还是负数
补码的{补码}是{原码}
真值与原码
真值为
If (x>=0)
原码={c1:0. X}
If (x<0)
原码={c1:1. X}
真值与反码
真值为
If (x>=0)
反码={c1:0. X}
If (x<0)
反码={c1:1.
真值与补码
真值为
If (x>=0)
补码={c1:0. X}
If (x<0)
补码={c1:1.
真值与移码
真值为
在真值的基础上加上一个偏置
若 x 长度为
一般偏置为{
真值为 0
{原码, 反码}, 表示不唯一
{补码, 移码}, 表示唯一
Q: 如何从
A:
C语言中的整数类型及类型转换
计算机中
有符号整型数据都是按{c1: 补码}形式储存
无符号整型数据都是按{c1: 二进制编码}形式储存
Q: 等长的整数有符号变量与无符号变量强制转换
A: 只是改变了第一位的解释
有符号数解释为符号位
无符号数解释为最高数值位
在 C 语言中, 整数有符号变量与无符号变量参与运算, 按{无符号}变量进行运算
Q: 在 C 语言中, 为什么整数有符号变量与无符号变量参与运算, 按照无符号变量计算?
A: 为了保证数据不丢失
例如
int 的范围:-2,147,483,648 到 2,147,483,647
unsigned int 的范围: 0 到 4,294,967,295
int A;
unsigned int B;
c=A+B;如果将 A+B 当作 int 类型计算, unsigned int 中大约一半的大数值 (从 2,147,483,648 到 4,294,967,295) 无法用 int 类型表示, 导致数据丢失
Q: 在 C 语言中, int 类型变量与 short 类型变量相加, 结果为什么类型变量?
A: int 类型
Q: 为什么在 C 语言中, int 类型变量与 short 类型变量相加, 结果为 int 类型变量?
A: C 语言中有一个整数提升 (Integer Promotion) 原则:
任何比 int “小”的整数类型 (如 char, short) 首先会被提升为 int 或 unsigned int
Q: 整数无符号大字长变量向小字长变量强制转换
A: 所有的无符号整数都直接用二进制保存
高位截断, 低位不变
Q: 整数有符号大字长变量向小字长变量强制转换
A: 所有的有符号整数都用补码的形式保存
不考虑原来的符号位, 直接高位截断, 低位不变
结果的最高位就当作类型转换之后的符号位. 该结果也是对应真值的补码表示
整数小字长变量向大字长变量强制转换
低位不变, 高位拓展
若原数字是无符号整数, 则进行{零}扩展
若原数字是有符号整数, 则进行{符号}扩展
Q: 为什么整数小字长变量向大字长变量强制转换
若原数字是无符号整数, 则进行零扩展
若原数字是有符号整数, 则进行符号扩展
A: 保持前后数值不变
8位unsigned short类型转化为16位unsigned int类型
125D→0111 1101B
零拓展
0111 1101B→0000 0000 0111 1101B→125D
8位short类型转化为16位int类型
-125D→1000 0011B
符号位拓展
1000 0011B→1111 1111 1000 0011B→-125D
可以看到虽然位数增加,但是对应的真值没有发生变化
Q: 不论无符号整数还是有符号整数
小字长变量向大字长变量强制转换
前后什么东西保持不变?
A: 保持转换前后数值不变
各种类型变量的长度
标志位的意义与判断
四大标志位的英文与意义
OF {Overflow Flag}
ZF {Zero Flag}
CF {Carry Flag}
SF {Sign Flag}
定点数的移位运算
逻辑移位和算术移位的区别
逻辑移位将所有的操作数都视作无符号数
算术移位将所有的操作数都视作有符号数
移位的补全
逻辑移位
- 左移: 低位补 {c1:0}
- 右移: 高位补 {c1:0}
算数移位 - 左移: 低位补 {c2:0}
- 右移: 高位补{c2: 符号位}
移位的溢出判断
不管是逻辑移位还是算术移位
只有{左移}会发生溢出
逻辑移位:{高位 1 移出}, 则溢出
算术移位:{左移前后符号位不同}, 则溢出
定点数的加减运算
OF 的判断
双符号位
符号位进位为
CF 的判断
无符号数才有{CF}
有符号数才有{OF}
Q: 什么是模四补码?
A: 一种变形补码
用两个二进制位来表示数字的符号位, 其余与补码相同
Q: 模 4 补码储存的时候需要几个符号位?
A: 储存的时候只用一个符号位
这是因为任何一个正确的数值, 模 4 补码的两个符位总是相同的
但在 ALU 中, 运算的时候, 是双符号位
符号位向高位拓展一次
定点数的乘除运算
乘法
Q: 原码定点数
定点数原码乘法运算
A: 1. 符号位:
2. 数值位:
画图, 32 位无符号数乘法运算的逻辑电路图

32 位乘法运算的溢出判断
有符号 (int)
不溢出条件: {c1:64 位乘积的高 32 位, 等于低 32 位符号位的扩展}
溢出条件: {c1:64 位乘积的高 32 位, 不等于低 32 位符号位的扩展}
无符号 (unsigned int)
不溢出条件: {c2:64 位乘积的高 32 位全部为 0}
溢出条件: {c2:64 位乘积的高 32 位不全为 0}
除法
Q: 原码定点数
定点数原码除法
A: 1. 符号位:
2. 拓展: 被除数
3. 数值位:
画图, 32 位无符号数除法运算的逻辑电路图

浮点数的表示与规格化
浮点数的表示
符号
阶码: 通常用补码, 移码表示
尾数: 通常用补码, 原码表示
浮点数的规格化
左规:
最高有效位为 0. 做左规可能出现多次
右规: 小数点左边存在有效位. 右规只有一次, 有可能导致上溢
IEEE754
IEEE754 标准的浮点数格式
- 位数
单精度:
符号{c1:1}阶码{c1:8}尾数{c1:23}
双精度:
符号{c2:1}阶码{c2:11}尾数{c2:52} - 机器数表示
阶数用{c3: 移码}表示, 偏置为 {c3: }
单精度偏置:127
双精度偏置:1023
尾数用{c3: 原码}表示 - 隐藏有效位
在尾数左边隐藏了一个有效位 1
IEEE754 标准的浮点数格式
阶数的取值范围
单精度:{
双精度:{
IEEE754 标准的单精度浮点数
阶码全为 0, 但尾数不全为 0:{非规格化数}
阶码全为 0, 且尾数全为 0:{0}
符号位为0,阶码全为1,且尾数全为0:{
符号位为1,阶码全为1,且尾数全为0:{
IEEE754 标准的浮点数 Floating-point=S,E,m
S 为符号位, E 为阶数位, m 为尾数位
真值计算公式:{
若阶数位
真值计算公式:{
IEEE 特殊表示需要记住吗
浮点数的加减运算
Q: 浮点数的加减运算公式化做题五步走
A: - 对阶
- 尾数运算
- 尾数规格化
- 舍入
- 溢出判断
尾数用原码表示, 规格化
目标为最高数值位=1
左规, 末位补 0
右规, 高位 0
尾数用补码表示, 规格化
目标为符号位
左规, 末位补 0
右规, 高位补符号位