当前位置: 首页 > news >正文

HNU计算机系统期中复习(下)

一:数据的机器级表示

1.1 整数

(1)有符号数和无符号数表示

做一道题:

某32位机器,考虑以下C代码:

int x = -1; unsigned u = 2147483648; printf("x = %u = %d\n", x, x); printf("u = %u = %d\n", u, u);

在32位机器上运行上述代码时,它的输出结果是什么?为什么?


输出结果

x = 4294967295 = -1 u = 2147483648 = -2147483648

变量x的分析

  • int x = -1;

在32位补码表示中,-1的二进制是1111...1111(32个1)

    • %d(有符号十进制)解释:按补码规则,这就是-1
    • %u(无符号十进制)解释:所有位都是1,对应无符号最大值 (2^{32}-1 = 4294967295)。

变量u的分析

  • unsigned u = 2147483648;

(2147483648 = 2^{31}),二进制表示为1000...0000(首位为1,后31位为0)

    • %u(无符号十进制)解释:这就是 (2^{31} = 2147483648)。
    • %d(有符号十进制)解释:按补码规则,首位为1表示负数,其值为 ( -2^{31} = -2147483648 )(32位有符号数的最小值TMin)。

总结:同一个32位二进制比特序列,解释为有符号数解释为无符号数,会得到完全不同的数值。printf的格式控制符(%d/%u)决定了如何解释内存中的比特位,而不是变量本身的类型。当表达式中同时含有无符号整数和有符号整数的时候,int转成无符号数。

(2)整数的拓展和截断

拓展:

就是把符号位不断复制到高位:

截断

1.核心概念

截断,是指将一个位数较长的整数转换为位数较短的整数时,直接截取其二进制低位部分,高位被丢弃的操作。

  • 无论是无符号数还是有符号数,本质上都是二进制位被截取
  • 截断后,同样的二进制序列需要按新的类型重新解释,因此数值意义与之前不同。

2.无符号数截断规则

  • 本质:取模运算(mod)

对于一个w位的无符号数x,截断为k位(k < w)时,结果等于x mod 2^k

  • 逻辑:丢弃高位,只保留低k位,结果按无符号数重新解释。

3.有符号数截断规则

  • 本质:类似取模运算,先按无符号数截断(取低k位),再按有符号数(补码)重新解释这个k位的二进制序列
  • 结果:数值可能发生巨大变化,甚至变成负数。

5.、案例解析

int x = 53191; short sx = (short)x; /* -12345 */ int y = sx; /* -12345 */

第一步:int x = 53191(32位有符号数)

  • 十进制53191的16位二进制表示为:1100111111000111

  • 高16位为0,低16位如上。

第二步:截断为short(16位有符号数)

  • 直接截取低16位:1100111111000111

  • 按16位补码解释:最高位为1,代表负数。

其值为:-12345,和注释一致。

第三步:int y = sx(16位→32位)

  • 这一步是符号位扩展,将16位的-12345扩展为32位有符号数,数值保持不变,所以y还是-12345


核心总结

  • 截断 = 丢弃高位,只留低位。
  • 无符号数:x mod 2^k
  • 有符号数:先截断,再按补码解释,数值可能“突变”。
  • 符号位扩展(short→int)不会改变数值,而截断(int→short)才会导致数值变化。

(3)整数的运算

无符号数加法:

补码加法:

本质和无符号数是一样的,只是会按照补码的规则去解读这个最后结果,会发生正溢出和负溢出

减法:

本质就是补码相加

无符号数乘法:

有符号数乘法

和无符号一样的,只是解读解结果会按照有符号解读

这里补充一下移位乘法

除法:

被除数是负数的时候,需要矫正,最后结果需要加一,被除数是正数的时候不需要修整

1.2 浮点数

二进制小数表示:

限制只能精确表达1/2的倍数

IEEE浮点数表示:

(1)规格化数:

Exp不等于全0或者全1

解决下面这个问题:

我们知道有13位,所以是E=13,然后固定的Bias是127,得到Exp

(2)非规格化数:

exp=000……0;

阶码值E=-Bias+1;尾数:M=0.xxxx

阶码exp尾数frac符号s含义
全 1全 00+∞
全 1全 01-∞
全 1非全 0任意NaN

(3)舍入

1. 向偶数舍入(默认 / 银行家舍入)
规则:舍入到最近可表示数;
若刚好居中,取最低位为偶数的那个。
特点:IEEE754 默认方式,误差最均衡、累计误差小。
2. 向零舍入(截断)
规则:直接砍掉多余位,向原点靠拢。
正数向下、负数向上,本质就是直接截断。
3. 向下舍入(向负无穷)
规则:无论正负,统一取更小的数。
4. 向上舍入(向正无穷)
规则:无论正负,统一取更大的数。

(4)浮点数乘法

(5)浮点数加法

1. 对阶:小阶向大阶看齐

浮点数相加,阶码必须相同才能运算。

规则:小阶向大阶对齐

阶码小的数,尾数右移,每右移 1 位,阶码 + 1,直到两数阶码相等。

原因:大阶变化范围更大,小阶迁就大阶,避免高位丢失,减少误差。

2. 尾数相加

对阶完成后,两数尾数(带隐含整数位 1)直接进行二进制加减运算。

3. 结果规格化 + 舍入

① 规格化,若尾数结果:1.xxxxx→ 已是规格化,不用动,若尾数进位:变成

10.xxxxx→ 尾数右移 1 位,阶码 +1若尾数过小:变成

0.xxxxx→ 尾数左移,阶码 −1,直到最高位为 1

② 舍入,规格化后多余低位,按 IEEE754 四种舍入规则处理(默认:向偶数舍入)。

4. 判断溢出

只看阶码:上溢

规格化后阶码 > 最大合法阶码→ 结果超出表示范围,变为下溢

规格化后阶码 < 最小合法阶码→ 数值无限接近 0,变为非规格化数或直接置 0

二:程序的机器级表示

2.1数据传送和寻址方式

没有内存到内存。有括号的含义是把寄存器里面的值当做内存地址,再从这个地址取出一个值给出去

记住下面这个基本就是全部的了:

2.2 算数操作指令

双操作指令:

单操作指令:

汇编指令与C代码有不同的执行顺序,有些代码对应多条指令,有些指令一次性可以完成多行代码

2.3 控制

1. CF 进位标志(Carry Flag)

  • 含义:无符号数最高位产生进位 / 借位
  • 为 1:加法有进位、减法有借位
  • 用途:判断无符号数溢出

2. ZF 零标志(Zero Flag)

  • 含义:运算结果是否为 0
  • ZF=1:结果 = 0
  • ZF=0:结果 ≠ 0

3. SF 符号标志(Sign Flag)

  • 含义:有符号数结果最高位(符号位)
  • SF=1:结果为负数
  • SF=0:结果为正数

4. OF 溢出标志(Overflow Flag)

  • 含义:有符号数运算是否溢出
  • 为 1:超出有符号数表示范围,结果错误
  • 口诀:正数 + 正数 = 负数 → 溢出负数 + 负数 = 正数 → 溢出

test1等价于计算a&b,不改变a和b的值

5. 跳转指令

6. 循环

do while,至少执行一次

7.swith

2.4 过程

1.过程与栈帧

机器用栈来传递过程参数,存储返回信息,保存寄存器用以后恢复,以及本地存储,而为单个过程分配的那部分叫做栈帧

每一个函数或过程在执行时候,都需要在内存中分配一个空间来保存运行时候的数据,这个空间用栈的方式进行操作叫栈帧

2.嵌套调用

p调用Q,Q在运行中再调用Q

http://www.jsqmd.com/news/714810/

相关文章:

  • 标准/工程化写法
  • 2026年油脂加工成套设备采购参考:榨油机、螺旋榨油机与液压榨油机这样选更靠谱 - 深度智识库
  • 3步解决《边缘世界》模组冲突的开源智能管理方案
  • 如何利用Audio Slicer实现高效音频智能分割:从技术原理到实战应用
  • 交流接触器每个端子的作用
  • 别再傻傻分不清了!Vector CANdb++ Editor和Admin到底该用哪个?(附详细功能对比图)
  • 别再手动算时间差了!用KingbaseES的UNIX_TIMESTAMP函数,5分钟搞定日期比较与排序
  • 2026年5月亨得利官方售后网点核验报告:老司机排雷 + 奇葩踩坑实录(含迁址/新开)实地考察・多方验证 - 亨得利官方服务中心
  • 别再傻傻分不清:Linux下TTY、PTS、PTY到底啥关系?一个SSH登录就全明白了
  • 2026最新辣椒面企业推荐!国内优质权威榜单发布,实力靠谱四川成都福建等地企业精选 - 十大品牌榜
  • 用RandLA-Net处理S3DIS数据集:从原始点云到6折交叉验证的完整实战解析
  • 打破音乐付费墙:MoeKoeMusic如何让你免费畅享VIP音乐体验
  • 基于MCP与Crawl4AI的动态RAG系统:为AI智能体构建实时知识库与代码验证能力
  • OpenClaw成本差异分析工具:AI代理API成本监控与优化实践
  • League Akari:英雄联盟玩家的终极工具箱完整使用指南
  • GetQzonehistory:如何完整备份你的QQ空间历史记录
  • 搭建装修的展示型小程序怎么做?4个获客场景拆解 - 维双云小凡
  • 别再只认识eth0了!玩转Linux虚拟网络:手把手创建dummy0并配置l4tbr0网桥
  • FlexASIO终极指南:如何在普通声卡上实现专业级ASIO低延迟音频体验
  • 重新定义Windows任务栏:RoundedTB的现代美学改造方案
  • 郑州北极电器服务:郑州热水器维修 油烟机维修厂家哪家专业 - LYL仔仔
  • TuriX-CUA:基于视觉大模型的桌面AI智能体部署与实战指南
  • 免费音频转换器fre:ac:从零开始构建你的数字音乐库
  • 2026年昆明短视频运营与AI全网推广服务商深度横评 - 优质企业观察收录
  • ESP32-C3开发板集成LCD与Qwiic接口解析
  • 别再只改Dockerfile了!:云原生Java函数冷启动性能瓶颈定位手册(火焰图+Arthas trace+eBPF syscall监控三件套)
  • Unsloth Studio 使用问题记录
  • 技术深度解析:Get-cookies.txt-LOCALLY - 本地化Cookie导出解决方案
  • 高级java每日一道面试题-2025年11月18日-容器与虚拟化题[Dockerj]-Docker 容器的核心隔离技术是什么?Linux Namespace 有哪些类型?
  • 向量数据库核心技术解析与RAG系统实践