无符号数的表示
无符号数:整个机器字长的全部二进制均为数值位,没有符号位,相当于数的绝对值
对于 1001 1100B = 156D
对于占据n个bit位的无符号数,有 2 n 2^n 2n 种情况,表示范围为0~ 2 n − 1 2^n-1 2n−1
1001 1100B B代表二进制(Binary)
156D D代表十进制(Decimal)
9CH H代表十六进制(Hexadecimal)
通常只有无符号整数,没有无符号小数
有符号数表示
原码
定点整数
小数点在最后隐藏起来
定点小数
表示范围
定点整数
定点小数
反码
若符号位为0,则反码与原码相同
若符号位为1,则数值位全部取反
整数和小数都一样
补码
正数的补码 = 原码
负数的补码 = 反码末位 + 1(要考虑进位)
定点整数
原码 00000000
反码 00000000
补码 00000000
原码 10000000
反码 11111111
补码 00000000 (丢弃进位)
我们先来看补码,负数0(11111111)如果+1,会进位,导致变成00000000,就和正数0一样了。说明在补码中+0 -0是一个东西。
那就多出了一种情况还没有表示数值,那我们就用 10000000表示最小的那个数,也就是
−
2
n
-2^n
−2n。
所以对于补码的表示范围
定点小数
转换
对于正数就是本身,没什么好说的
对于负数,无论是原码到补码 ,还是补码到原码,都是取反+1
移码
无论正负,在补码的基础上将符号位取反
但是,移码只能用于表示整数
补码0 00000000
移码0 10000000
都是只有一种表示形式
总结
各种码的作用
加减运算

加法代替减法
核心思想:把减法转化成加法(因为减法电路成本高)
前置知识:负数的模
-3 mod 12 = 9
-3 = (-1)*12+9-15 mod 12 = 9
-15 = (-2)*12+9(mod 12)把所有整数分为12类(余数是0~11)
mod 余数相同的数是同一类,是等价的对于计算机而言,一个字节是8bit,所以计算机天然的就mod 2 8 2^8 28,所以对于一个负数,我们把它 mod 2 8 2^8 28(本质就是找他的补码),就可以转化成正数了
C语言强制类型转换
#include <stdio.h>
#include <stdlib.h>
int main() {
// C语言定点整数都是用补码存储的
// 无符号数与有符号数,不改变数据内容,改变解释方式
short x=-4321;
unsigned short y=(unsigned short)x;
printf("%d\n",x);
printf("%d\n",y);
// 长整数变短整数:高位截断,保留低位
int a=165537,b=-34991;
short c=(short)a,d=(short)b;
printf("%d\n",c);
printf("%d\n",d);
// 短整数变长整数:符号扩展
x=-4321;
int m=x;
unsigned short n=(unsigned short)x;
unsigned int p=n;
printf("%d\n",m);
printf("%d\n",n);
printf("%d\n",p);
}
对于拓展,正数和无符号数补0,负数补1
数字电路复习
与门
或门
非门
与非
或非
异或
同或
多路选择器(multiplexer,MUX)
电路的守门员。在多个输入数据中,只允许其中一个数据通过
如果说输入数据有8个,那么控制信号只需要 8bit 就可以了
三态门
根据控制信号决定是否让数据通过
区分非门和三态门要看是不是有控制信号!!!
加法器
加法器的基本结构
一位加法器
合并后


n bit 加法器
现在这个加法器叫做串行进位并行加法器**(串行体现在进位,并行体现在这n个bit是一起输入的)**
显然,并行进位的并行加法器效率更高
CLA部件解析
每一个进位其实都在输入的时候准备好了,那么其实每个位的进位信息几乎是同时产生的。那么代价是什么?电路会非常复杂,所以通常采用每四个加法器使用一个CLA部件。
带标志位的加法器
总结
ALU
CPU由控制器,运算器组成
控制器负责解析指令
运算器负责对数据进行处理
ALU是运算器的核心
而加法器又是ALU的核心,因为加减乘除运算都需要基于加法来实现
机器字长(Machine Word Length)是指计算机处理器(CPU)能够一次性处理或存储的二进制位数(bit)。它通常决定了计算机的数据处理能力、寄存器的大小、内存寻址范围以及指令集架构。
机器字长的常见值:
- 8位(bit):早期的计算机,如Intel 8080
- 16位(bit):如Intel 8086
- 32位(bit):如Intel 80386、Pentium系列
- 64位(bit):现代CPU,如Intel Core i系列、AMD Ryzen
机器字长的影响:
- 数据处理能力:较长的字长可以一次处理更多的数据,提高计算速度。
- 内存寻址能力:字长决定了CPU的寻址范围,例如:
- 32位CPU最多寻址 2³² = 4GB 的内存
- 64位CPU最多寻址 2⁶⁴ = 16EB(Exabyte),远超当前计算需求
- 指令长度:大多数CPU的指令长度与字长相关,影响指令的执行效率。
- 寄存器大小:寄存器的大小通常等于字长,影响计算的精度和速度。比如一个寄存器的宽度就是64bit也就是8个字节
在现代计算机中,64位架构已成为主流,但某些嵌入式系统和老旧设备仍可能使用32位甚至16位架构。
事实上,正是ALU的输入输出bit位数决定了机器字长
算术移位
原码的算数移位
符号位保持不变,仅对数值位进行移位
右移:高位补0,低位舍弃。若舍弃的位=0,则相当于÷2;若舍弃的位≠0,则会丢失精度
左移:低位补0,高位舍弃。若舍弃的位=0,则相当于×2;若舍弃的位≠0,则会出现严重误差
定点小数同理,只不过是小数点换了个位置
反码的算数移位
补码的算数移位
对于正数,补码的算数移位和反码和原码都相同
但是对于负数,我们首先要把这个码分为两个区,一个是同反码区,一个是同原码区。
当同反码区需要补位的时候,补1
当同原码区需要补位的时候,补0
总结
逻辑移位
直接移位对于什么码都一样,直接移就可以,并且全都补0

循环移位
带进位位和不带进位位都是一样的,以右移举例
如果不带进位位,最后一个到最前面
如果带进位位,最后一个到进位位
可用于切换大端存储和小端存储
定点数的加减运算
原码的加减运算
补码的加减运算
符号位直接参与运算即可
设机器字长为八位(含一位符号位)。原码进行补位的时候,无论正负都补零。
当进行原码转化为补码的时候,对于负数:最右边的 1 和它右边的 还有 符号位 不变
当我们进行补码转化为它的负数的时候(减法转化为加法的时候要用),除了原码转化为补码的规则,符号位也要取反
溢出判断

无符号数的加减运算
等价于带符号数的补码运算
对于加法 进位了相当于溢出
对于减法 没进位相当于溢出
补码加减运算电路
OF(Overflow Flag)
用来判断有符号数
采用补码溢出判断的第二种方法,也就是 数值最高位进位 和 符号位进位 取异或
SF(Sign Flag)
最高位为1即是负值,最高位为0即是正值
ZF(Zero Flag)
把所有运算结果取或非,只有当所有结果都是0的时候,ZF才为1,此时表示运算结果为0
CF(Carry Flag)
用来判断无符号数
把初始的表示加法运算的cin
和最后的cout
取异或
当cin
为0,cout
为1,代表加法运算发生了进位,即溢出
当cin
为1,cout
为0,表示减法运算没有发生进位,即溢出
原码的乘法
补码的乘法
原码除法
!外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
补码除法
浮点数的表示
数据的存储与排列
大小端存储
对于机器来说,无论何时都会先读取最低有效字节。好处是比如进行加法运算的时候,往往最低有效字节是需要被第一时间处理的
边界对齐
对于32位系统
按字节寻址:8个bit 8个bit的找
按半节寻址:16个bit 16个bit的找
[外链图片转存中…(img-2KiuL1Sc-1746977929306)][外链图片转存中…(img-A7mWJocl-1746977929306)]
补码除法
[外链图片转存中…(img-AEa8rX4B-1746977929306)]
浮点数的表示
[外链图片转存中…(img-BVKNzTTp-1746977929307)]
[外链图片转存中…(img-EtTHpp24-1746977929307)]
数据的存储与排列
大小端存储
[外链图片转存中…(img-y5pNGPpr-1746977929307)]
对于机器来说,无论何时都会先读取最低有效字节。好处是比如进行加法运算的时候,往往最低有效字节是需要被第一时间处理的
边界对齐
[外链图片转存中…(img-qjkPQ21m-1746977929307)]
对于32位系统
按字节寻址:8个bit 8个bit的找
按半节寻址:16个bit 16个bit的找
按字寻址:32个bit 32个bit的找