一文带你彻底了解计算机编码

无符号数的表示

无符号数:整个机器字长的全部二进制均为数值位,没有符号位,相当于数的绝对值

对于 1001 1100B = 156D

对于占据n个bit位的无符号数,有 2 n 2^n 2n 种情况,表示范围为0~ 2 n − 1 2^n-1 2n1

1001 1100B B代表二进制(Binary)

156D D代表十进制(Decimal)

9CH H代表十六进制(Hexadecimal)

通常只有无符号整数,没有无符号小数

有符号数表示

原码

定点整数

image-20250318170538022

小数点在最后隐藏起来

image-20250318170725150

定点小数

image-20250318171124315

表示范围

定点整数

image-20250318171338042

定点小数

image-20250318171436377

反码

若符号位为0,则反码与原码相同

若符号位为1,则数值位全部取反

整数和小数都一样

补码

正数的补码 = 原码

负数的补码 = 反码末位 + 1(要考虑进位)

定点整数

原码 00000000
反码 00000000
补码 00000000

原码 10000000
反码 11111111
补码 00000000 (丢弃进位)

我们先来看补码,负数0(11111111)如果+1,会进位,导致变成00000000,就和正数0一样了。说明在补码中+0 -0是一个东西。
那就多出了一种情况还没有表示数值,那我们就用 10000000表示最小的那个数,也就是 − 2 n -2^n 2n

所以对于补码的表示范围

image-20250318173127542

定点小数

image-20250318173215127

转换

对于正数就是本身,没什么好说的

对于负数,无论是原码到补码 ,还是补码到原码,都是取反+1

移码

无论正负,在补码的基础上将符号位取反

但是,移码只能用于表示整数

补码0 00000000

移码0 10000000

都是只有一种表示形式

image-20250318173917581

总结

image-20250318174049307

各种码的作用

加减运算

加法代替减法

核心思想:把减法转化成加法(因为减法电路成本高)

前置知识:负数的模

-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(本质就是找他的补码),就可以转化成正数了

image-20250318194857852

image-20250318194913263

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);

    
}

image-20250318184909919

对于拓展,正数和无符号数补0,负数补1

image-20250318185245013

数字电路复习

与门

image-20250318185901504

或门

image-20250318185959342

非门

image-20250318190104393

与非

image-20250318190234028

或非

image-20250318190415229

异或

image-20250318190440774

image-20250318190643150

同或

image-20250318190541436

多路选择器(multiplexer,MUX)

电路的守门员。在多个输入数据中,只允许其中一个数据通过

image-20250318190957537

如果说输入数据有8个,那么控制信号只需要 8bit 就可以了

三态门

根据控制信号决定是否让数据通过

image-20250318191313140

区分非门和三态门要看是不是有控制信号!!!

加法器

加法器的基本结构

image-20250318195138607

一位加法器

image-20250318195603337

合并后

image-20250318195637317

e7dac1e349e2dc98722355250ab7a37 27b48ffa6cabf1a928275710a08e084

image-20250318200922669

n bit 加法器

image-20250318201005453

现在这个加法器叫做串行进位并行加法器**(串行体现在进位,并行体现在这n个bit是一起输入的)**

显然,并行进位的并行加法器效率更高

image-20250318201527883

CLA部件解析

image-20250319115144904

每一个进位其实都在输入的时候准备好了,那么其实每个位的进位信息几乎是同时产生的。那么代价是什么?电路会非常复杂,所以通常采用每四个加法器使用一个CLA部件。

带标志位的加法器

image-20250318201633140

image-20250318201940377

总结

image-20250318202019961

ALU

CPU由控制器,运算器组成

控制器负责解析指令

运算器负责对数据进行处理

ALU是运算器的核心

而加法器又是ALU的核心,因为加减乘除运算都需要基于加法来实现

image-20250319121224905

image-20250319121600812

机器字长(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

机器字长的影响:

  1. 数据处理能力:较长的字长可以一次处理更多的数据,提高计算速度。
  2. 内存寻址能力:字长决定了CPU的寻址范围,例如:
    • 32位CPU最多寻址 2³² = 4GB 的内存
    • 64位CPU最多寻址 2⁶⁴ = 16EB(Exabyte),远超当前计算需求
  3. 指令长度:大多数CPU的指令长度与字长相关,影响指令的执行效率。
  4. 寄存器大小:寄存器的大小通常等于字长,影响计算的精度和速度。比如一个寄存器的宽度就是64bit也就是8个字节

在现代计算机中,64位架构已成为主流,但某些嵌入式系统和老旧设备仍可能使用32位甚至16位架构。

事实上,正是ALU的输入输出bit位数决定了机器字长

算术移位

原码的算数移位

符号位保持不变,仅对数值位进行移位

右移:高位补0,低位舍弃。若舍弃的位=0,则相当于÷2;若舍弃的位≠0,则会丢失精度

左移:低位补0,高位舍弃。若舍弃的位=0,则相当于×2;若舍弃的位≠0,则会出现严重误差

image-20250319154553283

定点小数同理,只不过是小数点换了个位置

image-20250319154800410

反码的算数移位

image-20250319155010775

补码的算数移位

对于正数,补码的算数移位和反码和原码都相同

但是对于负数,我们首先要把这个码分为两个区,一个是同反码区,一个是同原码区

image-20250319165314821

当同反码区需要补位的时候,补1

当同原码区需要补位的时候,补0

总结

image-20250319165531993

逻辑移位

直接移位对于什么码都一样,直接移就可以,并且全都补0

image-20250319170103172

image-20250319170442271

循环移位

带进位位和不带进位位都是一样的,以右移举例

如果不带进位位,最后一个到最前面

如果带进位位,最后一个到进位位

image-20250319171216109

可用于切换大端存储和小端存储

定点数的加减运算

原码的加减运算

image-20250402232357618

补码的加减运算

符号位直接参与运算即可

image-20250402233550965

设机器字长为八位(含一位符号位)。原码进行补位的时候,无论正负都补零。

当进行原码转化为补码的时候,对于负数:最右边的 1 和它右边的 还有 符号位 不变

当我们进行补码转化为它的负数的时候(减法转化为加法的时候要用),除了原码转化为补码的规则,符号位也要取反

e1cc394ece85807b98256d70e90e6f8

image-20250403110220319

溢出判断

image-20250403110724546

image-20250403111407037

image-20250403111952255

image-20250403112121346

无符号数的加减运算

等价于带符号数的补码运算

image-20250403113708909

对于加法 进位了相当于溢出

对于减法 没进位相当于溢出

补码加减运算电路

image-20250403122059254

image-20250403122253605

image-20250403123033417

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,表示减法运算没有发生进位,即溢出

原码的乘法

image-20250403125349982

image-20250408103412918

image-20250408103539279

补码的乘法

image-20250408104437784

image-20250408105143146

原码除法

image-20250408111010558

!外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传image-20250408111406682

补码除法

image-20250408111628020

浮点数的表示

image-20250408113916209

image-20250408114128693

数据的存储与排列

大小端存储

image-20250408153331515

对于机器来说,无论何时都会先读取最低有效字节。好处是比如进行加法运算的时候,往往最低有效字节是需要被第一时间处理的

边界对齐

image-20250408153622701

对于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的找

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值