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

《计算机系统基础》—— 运算

文章目录

  • 《计算机系统基础》——运算
    • 整数
      • 按位运算
        • 作用
        • 操作
      • 位移运算
        • 作用
        • 操作
      • 乘法运算
      • 除法运算
    • 浮点数
      • 加减运算
      • 乘除运算

《计算机系统基础》——运算

🚀🚀本章我们需要介绍的是有关C语言里面的运算,当然了,我们不会是介绍简单的运算,而是详细地介绍一下我们在日常开发中进行运算时可能遇到的问题。好了就让我们开始今天的学习吧!

整数

按位运算

作用

🚀🚀按位运算在我们日常的开发中出现的比较少,他的作用主要就是对位串实现“掩码”(mask)操作或相应的其他处理,比如在嵌入式领域一般用来控制寄存器的值,以达到相应的功能。

操作

  • 按位或:“|”
  • 按位与:“&”
  • 按位取反:“~”
  • 按位异或:“^”

🚀🚀比如用下面的语句用“&”实现“掩码”操作,作用为从数据y中提取低位字节,并使高字节为0。

y & 0x00FF

位移运算

🚀🚀一提到移位操作,很多人就是觉得只是用来乘除2的,但是事情并没有那么简单,接下来我们来详细的介绍一下。

作用

🚀🚀位移运算在我们的日常开发中一般都是用来乘除2的,但是它不仅仅只有这一个功能,除此之外,它还可以提取部分信息。

操作

  • 左移: x<<k(乘2)
  • 右移: x>>k(除2)
    • 逻辑右移:在左边补k个0
    • 算数右移:在左边补k个最高位的有效数字

🚀🚀我们在下方给出关于逻辑右移和算数右移的例子来帮助大家理解。

操作值1值2
参数x[01100011][10010101]
x << 4[00110000][01010000]
x >> 4(逻辑右移)[00000110][00001001]
x >> 4(算数运算)[00000110][11111001]

🚀🚀如果位移数大于数据位数怎么办呢?答案很简单,会对数据取余,比如对32位数据右移36位,其实就是右移4位。

乘法运算

🚀🚀在高级语言中,两个n位整数相乘得到的结果通常也是 一个n位整数,也即结果只取2n位乘积中的低n位

🚀🚀比如:0101 * 0101 = 00011001,我们只取后4位,得到1001,经过换算,结果应该是-111,也就是-7,显然与我们想要得到的数字明显不一样。

🚀🚀那我们有没有什么办法去判断我们的结果是否是正确的呢?或者说,到底什么情况下结果不会溢出?答案是肯定的,我们接下来就来介绍一下。

🚀🚀判断我们最后的结果是正确的,我们可以使用下面的语句去判断:

!x || z/x==y 为真时

🚀🚀然后当我们的结果在:-2n-1 ≤ x*y < 2n-1 时,结果是不会溢出的,其实也就是:乘积的高n+1位为全0或全1,这样的结果就是正确的。


🚀🚀整数乘法运算比移位和加法等运算所用时间长,因此,编译器在处理变量与常数相乘时,往往以移位、加法和减法的组合运算来代替乘法运算,所以我们可以使用位移来代替乘法指令,比如x * 20,因为20 = 16 + 20 = 24 + 22 ,所以我们可以转换为(x<<4)+(x<<2)。

除法运算

🚀🚀除法运算和乘法运算其实是类似的,但是只有带符号整数进行**-2n-1/-1 = 2n-1**操作会发生溢出之外,其他都不会溢出,因为2n-1无法用n位来表示。

#include<stdio.h>void main ()
{int u = 0x80000000; printf ("u = %x = %x = %d\n", u , u / -1, u / -1);      
}

🚀🚀运行结果如下所示:u = 80000000 = 80000000 = -2147483648,我们可以看到,在16进制下,u和u / -1 的结果是一样的。

🚀🚀除法运算的商为整数,于是如何进行取整就很重要了,我们只需要记住一个原则,就是按照朝0的方向舍入。即正数商取比自身小的最接近整数,负数商取比自身大的最接近整数

🚀🚀同样的,为了缩短除法运算的时间我们可以采用右移运算来实现。如果能整除,我们就直接右移,如果不能整除,我们就可以加一个偏移量(2k -1),再右移即可,接下来我们就来介绍一下。

14/4 = 30000 1110 >> 2 = 0000 0011
-14/4 = 1111 0010 + 0000 00111111 0101 >> 2 = 1111 1101 = -3

浮点数

🚀🚀对于浮点数,我们就不做过多的介绍,简单介绍一下运算以及其异常,但是浮点运算涉及的精度以及异常是非常重要的,有机会以后可以单独介绍一下,

加减运算

🚀🚀对于浮点数的加减运算,我们只需要注意,他是先对齐阶码,再进行运算,如下所示:

A ± B = (Ma + Mb* 2-(Ea-Eb)) * 2Ea (假设Ea>=Eb )

🚀🚀需要注意的就是,当我们的尾数高位为0,则需左规:尾数左移一次,阶码减1,直到MSB为1。当尾数最高位有进位,需右规:尾数右移一次,阶码加1,直到MSB为1

乘除运算

🚀🚀乘除运算就需要注意阶码上溢(一个正指数超过了最大允许值)和下溢(一个负指数超过了最小允许值)的问题。过多的就不再介绍了,感兴趣的同学可以自行去查找资料。

相关文章:

《计算机系统基础》—— 运算

文章目录《计算机系统基础》——运算整数按位运算作用操作位移运算作用操作乘法运算除法运算浮点数加减运算乘除运算《计算机系统基础》——运算 &#x1f680;&#x1f680;本章我们需要介绍的是有关C语言里面的运算&#xff0c;当然了&#xff0c;我们不会是介绍简单的运算&…...

MSTP多进程讲解与实验配置

目录 MSTP多进程 专业术语 MSTP多进程配置 在MSTP域配置 MSTP多进程 多进程的作用 将设备上的端口绑定到不同的进程中&#xff0c;以进程为单位进行MSTP计算&#xff0c;不在同一进程内的端口不参与此进程中的MSTP协议计算&#xff0c;实现各个进程之间的生成树计算相互独立…...

【Python】软件测试必备:了解 fixture 在自动化测试中的重要作用

在自动化软件测试中&#xff0c;fixture 是一种确保测试在一致且受控条件下运行的重要方法。简单来说&#xff0c;fixture 就是一组先决条件或固定状态&#xff0c;必须在运行一组测试之前建立。在测试框架中&#xff0c;fixture 提供了一种方便的方法&#xff0c;用于在每个测…...

DevExpress皮肤引用的办法

1.引用Dll皮肤文件Typeprocedure SetSkin(skinnam:string);procedure TFrmMain.SetSkin(skinnam:string);varHinst:THANDLE;RStream:TResourceStream;beginHinst:Loadlibrary(ALLSK.dll);If Hinst0 ThenExitelsebeginRstream:TResourceStream.Create(Hinst,skinnam,MYSKIN);dxS…...

2023-03-04 区分纳米颗粒核壳原子

声明&#xff1a;未经允许&#xff0c;不得擅自复制、转载。欢迎引用&#xff1a;Laser-Assisted Synthesis of Bi-Decorated Pt Aerogel for Efficient Methanol Oxidation ElectrocatalysisApplied Surface Science ( IF 6.707 ) Pub Date : 2022-04-01 , DOI: 10.1016/j.aps…...

review设备管理

目录 1、设备管理基础知识 &#xff08;1&#xff09;、外部设备分类 &#xff08;2&#xff09;、注意事项 2、I/O硬件原理 &#xff08;1&#xff09;、不同方式对I/O设备分类 &#xff08;2&#xff09;、I/O控制方式 &#xff08;3&#xff09;、设备控制器 3、I/O软…...

Cadence Allegro 导出Bill of Material Report (Condensed)详解

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,Bill of Material Report (Condensed)作用3,Bill of Material Report (Condensed)示例4,Bill of Material Report (Condensed)导出方法4.1,方法14.2,方法2,...

B. Sherlock and his girlfriend

Sherlock has a new girlfriend (so unlike him!). Valentines day is coming and he wants to gift her some jewelry. He bought n pieces of jewelry. The i-th piece has price equal to i  1, that is, the prices of the jewelry are 2, 3, 4, ... n  1. Watson…...

Spring SpEL表达式

Java知识点总结&#xff1a;想看的可以从这里进入 目录17、Spring SpEL17.1、简介17.2、配合value使用17.2.1、基本字面值17.2.2、类相关表达式17.2.3、properties17.2.4、T运算符17.2.5、new17.2.6、Elvis运算符17.2.7、运算符17.2、配合XML使用17、Spring SpEL 17.1、简介 S…...

Nginx反向代理原理详解与配置

Nginx反向代理是一种常用的反向代理技术&#xff0c;它允许您将一个或多个Web服务器上的内容公开给Internet上的客户端&#xff0c;而不必暴露您的服务器的IP地址。Nginx反向代理的原理是&#xff1a;客户端发出一个HTTP请求&#xff0c;Nginx服务器收到请求后&#xff0c;将请…...

Happen-Before从入门到踹门

什么是Happen-Before有人翻译为"先行发生原则"&#xff0c;其实也没错&#xff0c;但是更准确的说法应该是&#xff0c;前一个操作的值&#xff0c;后一个总能察觉到。Happen-Before的八条规则程序有序性&#xff1a;在前面的代码优先于在后面的代码执行volatile的变…...

电力系统系统潮流分析【IEEE 57 节点】(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…...

Java——N皇后问题

题目链接 leetcode在线oj题——N皇后 题目描述 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff…...

Mybatis一级缓存与二级缓存

一、MyBatis 缓存缓存就是内存中的数据&#xff0c;常常来自对数据库查询结果的保存。使用缓存&#xff0c;我们可以避免频繁与数据库进行交互&#xff0c;从而提高响应速度。MyBatis 也提供了对缓存的支持&#xff0c;分为一级缓存和二级缓存&#xff0c;来看下下面这张图&…...

LQB,手打,PCF8591,ADDA转换,AD1是光敏电阻,AD3是电位器,DA输出

在上述at24c02de 基础上&#xff0c;添加三个函数 一个是读取通道1光敏电阻的数据&#xff1b; 一个是读取通道3的电压&#xff1b; 一个是输出DA的数据。。 5V的AD DA。 如果读入的电压是5V&#xff0c;输入AD&#xff0c;就是255&#xff1b; 如果是0V&#xff0c;就是00000…...

【计组笔记06】计算机组成与原理之控制器和总线结构

这篇文章,主要介绍计算机组成与原理之控制器和总线结构。 目录 一、控制器功能 1.1、控制器组成 1.2、控制单元的输入和输出...

elisp简单实例: auto-save

elisp 能找一个简单又实用的代码很不容易,以下代码不是我的原创,只是结合自己的理解,添加修正了一些注释,荣誉归原作者,感谢原作者的开源精神! 调用说明: 把后面代码存为auto-save.el 在init.el 中写上 (require auto-save) 就可以了. 下面是auto-save.el 内容了. ;; 我…...

写字楼/园区/购物中心空置率太高?快用快鲸智慧楼宇系统

客户租不租你的写字楼&#xff0c;事关区位、交通、环境、价格、面积、装修等诸多因素&#xff0c;但很多招商部对这些影响客户决策的数据并不重视&#xff0c;在客户初次上门看房时仅简单记录姓名、联系方式、需求面积&#xff0c;对其他核心数据熟视无睹&#xff0c;也为日后…...

【JavaSE】数组的定义和使用(上)

数组的定义和使用&#xff08;上&#xff09;6-数组的定义与使用1. 数组的基本概念1.1 为什么要使用数组1.2 什么是数组1.3 数组的创建及初始化1.3.1 数组的创建1.3.2 数组的初始化1.4 数组的使用1.4.1 数组中元素的访问1.4.2 遍历数组2. 数组是引用类型2.1 初始JVM的内存分布2…...

计算机的学习路线

本文是介绍如何成为一个Geek&#xff0c;一个真正的计算机高手。 适合有成为IT领域技术大牛的人参考。 写给大一新生和所有向深耕IT领域的人&#xff0c;避免走一些弯路。 第一门入门的必备功课-语法与算法 什么是计算机&#xff1f; 用来做运算的机器 电子计算机在运算方面…...

零成本实现外网访问内网WebDAV:cpolar内网穿透实战教程

零成本实现外网访问内网WebDAV&#xff1a;cpolar内网穿透实战教程 对于需要远程访问家中或办公室文件的用户来说&#xff0c;WebDAV协议提供了一种便捷的文件共享方式。然而&#xff0c;缺乏公网IP往往成为阻碍。本文将详细介绍如何利用cpolar工具&#xff0c;无需复杂网络配…...

C++传记 类的定义(面向对象)

面向对象编程&#xff08;OOP&#xff09;是C的核心特性之一&#xff0c;其核心思想是“封装、继承、多态”&#xff0c;而则是实现面向对象编程的基础载体——它本质上是一种自定义的数据类型&#xff0c;用于封装一组相关的属性&#xff08;数据&#xff09;和行为&#xff0…...

OnTopReplica组切换模式揭秘:自动轮换多个监控窗口的完整指南

OnTopReplica组切换模式揭秘&#xff1a;自动轮换多个监控窗口的完整指南 【免费下载链接】OnTopReplica A real-time always-on-top “replica” of a window of your choice (on Windows). 项目地址: https://gitcode.com/gh_mirrors/on/OnTopReplica OnTopReplica是一…...

memory-lancedb-pro混合检索揭秘:向量搜索+BM25如何提升AI记忆准确率300%

memory-lancedb-pro混合检索揭秘&#xff1a;向量搜索BM25如何提升AI记忆准确率300% 【免费下载链接】memory-lancedb-pro Enhanced LanceDB memory plugin for OpenClaw — Hybrid Retrieval (Vector BM25), Cross-Encoder Rerank, Multi-Scope Isolation, Management CLI …...

计算机毕业设计springboot鲜花在线商城 基于SpringBoot的园艺花卉网络销售系统 基于Java Web的线上花店订购管理平台

计算机毕业设计springboot鲜花在线商城911yt9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联xi 可分享近年来&#xff0c;互联网技术的迅猛发展和智能终端设备的全面普及&#xff0c;为传统零售行业带来…...

海康MVS安装注意事项

⒈目的 掌握海康MVS相机配置软件安装技巧&#xff0c;以便在MvCameraControlNet的演示案例运行时不报错&#xff08;通常为找不到MvCameraControl.dll&#xff09;&#xff0c;问题为MVS安装时无法对安装环境进行配置。 ⒉安装资源 在海康机器人官网上&#xff1a;海康机器人…...

STM32F103C6 USB DFU升级实战:从CubeMX配置到DfuSeDemo烧录,一步步教你搞定Bootloader设计

STM32F103C6 USB DFU升级全流程解析&#xff1a;从硬件配置到安全跳转的深度实践 在嵌入式开发中&#xff0c;固件升级是产品生命周期中不可或缺的环节。想象一下这样的场景&#xff1a;你的设备已经部署在客户现场&#xff0c;突然发现一个需要紧急修复的BUG&#xff0c;或者需…...

GitLab实战:如何用rebase -i优雅合并多个commit(附常见错误排查)

Git提交历史优化&#xff1a;交互式rebase高阶操作指南 1. 为什么需要整理Git提交历史 在团队协作开发中&#xff0c;我们经常会遇到提交历史杂乱无章的情况。想象一下这样的场景&#xff1a;你完成了一个新功能的开发&#xff0c;但在这个过程中产生了十几个零散的提交记录&am…...

Linux等保测评实战:这些命令帮你快速搞定90%的检查项

Linux等保测评实战&#xff1a;高效命令组合与深度解析 1. 等保测评的核心挑战与Linux应对策略 每次面对等保测评&#xff0c;不少系统管理员都会感到压力山大。时间紧、任务重、检查项繁杂&#xff0c;如何在有限时间内高效完成合规检查&#xff0c;同时确保系统安全无虞&…...

Pcap-Analyzer:Python可视化离线数据包分析工具全攻略

Pcap-Analyzer&#xff1a;Python可视化离线数据包分析工具全攻略 【免费下载链接】Pcap-Analyzer Python编写的可视化的离线数据包分析器 项目地址: https://gitcode.com/gh_mirrors/pc/Pcap-Analyzer 一、功能解析&#xff1a;数据包分析的瑞士军刀 1.1 核心功能图谱…...