深入理解计算机系统学习笔记

2.3整数运算

 有时候会发现两个正数相加会得出一个负数,而比较表达式x<y和比较表达式x-y<0会产生不同的结果。这些属性是由于计算机运算的有限性造成的。理解计算机运算的细微之处能够帮助程序员编写更可靠的代码。

2 .3. 1 无符号加法

原理:

在正常情况下,和w + 1 位表示中的最高位会等于0,因此丢弃它不会改变这个数值。但是当他的结果超过范围时,和的w+1 位 表示中的最高位会等于1,因此丢弃它就相当于从和中减去 了2的w次方。

说一个算术运算溢出,是指完整的整数结果不能放到数据类型的字长限制中去。

当执行C程序时,不会将溢出作为错误而发信号。不过有的时候,我们可能希望判定 是否发生了溢出。对于无符号整数,正常情况下两个数的求和的结果是一定大于任意一个数的。当发现求出的和出现小于时就应该时发生了溢出。

2.3.2 补码加法

对于补码加法,我们必须确定当结果太大(为正)或者太小(为负)时,应该做些什么。

运算规则如下:

当发生正溢出时,结果会被截断为与原始位数相同的位数,丢失了溢出的高位。

假设我们有两个正数 +127 和 +2,它们的补码分别为0111 1111和 0000 0010,将它们相加得到1000 0001,对应十进制数为 -127。是由于这个结果超出了8位补码能够表示的范围(-128 到 127),因此发生了正溢出。

当负溢出发生时,结果会被截断为与原始位数相同的位数,丢失了溢出的高位。

假设我们有两个负数 -128 和 -1,它们的补码分别为1000 0000 和1111 1111,将它们相加得到0111 1111,对应十进制数为 +127。是由于这个结果超出了8位补码能够表示的范围(-128 到 127),因此发生了负溢出。

2.3.3 补码的非

补码的非操作是指对一个补码数的每一位取反(0变为1,1变为0),然后再加1。它的作用是将一个有符号整数变为它的相反数。

2.3.4 无符号乘法

将一个无符号数截断为w位等价于计算该值摸2的w次方,得到:

2.3.5 补码乘法

将一个补码数截断为w位相当于先计算该值模2的w次方,再把无符号数转换为补码,得到:

2.3.6 乘以常数

以往,在大多数机器上,整数乘法指令相当慢,需要10个或者更多的时钟周期,然 而其他整数运算(例如加法、减法、位级运算和移位)只需要1个时钟周期。因此,编译器使用 了一项重要的优化,试着用移位和加法运算的组合来代替乘以常数因子的乘法。

首先,我们会考虑乘以2的幂的情况。

一个无符号整数乘以2的w次方,相当于左移w个二进制位 。

对于其他数字例如,假设一个程序包含表达式x * 14。利 用14=2^3+2^2+2^1],编译器会将乘法重写为(x<<3)+(x<<2)+(x<<l),将一个乘法替换为三个移位和两个加法。

2.3.7 除以2的幂

在大多数机器上,整数除法要比整数乘法更慢—需要30个或者更多的时钟周期。 除以2的幂也可以用移位运算来实现,只不过我们用的是右移,而不是左移。无符号和补 码数分别使用逻辑移位和算术移位来达到目的。  

2.4 浮点数

浮点表示对形如V=xX2^y的有理数进行编码。它对执行涉及非常大的数字、非常接近于0的数字,以及更普遍地作为实数运算的近似值的计算,是很 有用的。    

2.4.1 二进制小数

理解浮点数的第一步是考虑含有小数值的二进制数字。首先,让我们来看看更熟悉的 十进制表示法。

例如:

现在换成二进制表示,例如:

其中,二进制小数点向左移动一位相当于这个数被2除,二进制小数点向右移动一位相当于将该 数乘2。

小数的二进制表示法只能表示那些能够被写成x X 2^y 的数。其他的值只能够被 近似地表示。例如,数字 1/5 可以用十进制小数0.20精确表示。不过,我们并不能把它准确地表示为一个二进制小数,我们只能近似地表示它,增加二进制表示的长度可以提高表示的精度。

2.4.2 IEEE浮点表示

由于定点表示法不能很有效地表示非常大的数字。例如,表达式5X2^100是 用101后面跟随100个零的位模式来表示。相反,我们希望通过给定x和j的值,来表示 形如:rX2> 的数。

符号(sign) s决定这数是负数(S=l)还是正数(S=0),而对于数值0的符号位解释 作为特殊情况处理。

尾数(significand) M是一个二进制小数,它的范围是1~2—e,或者是0 ~1—e。

阶码(exponent) E的作用是对浮点数加权,这个权重是2的£ :次幂(可能是负数)。

2.4.3舍入

因为表示方法限制了浮点数的范围和精度,所以浮点运算只能近似地表示实数运算。 因此,对于值工,我们一般想用一种系统的方法,能够找到 “最接近的” 匹配值:c',它可 以用期望的浮点形式表示出来。这就是舍入(rounding)运算的任务。

IEEE 浮点格式定义了四种不同的舍入方式。默认的方法是找到最接近的匹配,而其他三种可用 于计算上界和下界。

向偶数舍人方式采用的方法是:它将数字向上或者向下舍人,使得结果的最低有效数字是偶数。

向偶数舍人法能够运用在二进制小数上。我们将最低有效位的值0认为是偶数,值1认为是奇数。

2.4.4 浮点运算

IEEE 标准指定了一个简单的规则,来确定诸如加法和乘法这样的算术运算的结果。 把浮点值:r和看成实数,而某个运算©定义在实数上,计算将产生尺0«« (工©30,这是 对实际运算的精确结果进行舍人后的结果。

IEEE 标准中指定浮点运算行为方法的一个优势在于,它可以独立于任何具体的硬件或 者软件实现。因此,我们可以检查它的抽象数学属性,而不必考虑它实际上是如何实现的。

2.4.5 C语言中的浮点数

所有的C语言版本提供了两种不同的浮点数据类型:float和double。在支持IEEE浮点 格式的机器上,这些数据类型就对应于单精度和双精度浮点。另外,这类机器使用向偶数舍人 的舍人方式。不幸的是,因为C语言标准不要求机器使用IEEE浮点,所以没有标准的方法来 改变舍人方式或者得到诸如-0 、正无穷、负无穷或者NaN之类的特殊值。

当在int、float和 double格式之间进行强制类型转换时,程序改变数值和位模式 的原则如下(假设int是64位的):

从int转换成float:数字不会溢出,但可能会被舍入。由于float的精度较低,一些较大的整数值可能会丢失精度。

从int或float转换成double:double有更大的范围和更高的精度,因此能够保留精确的数值。转换过程中不会发生溢出。

从double转换成float:由于float的范围较小,double的值可能会溢出成正无穷或负无穷。此外,由于精度较低,double的值可能会被舍入。

从float或double转换成int:值将会向零舍入。在64位情况下,如果浮点数的值超出了int能表示的范围,转换结果将会是未定义的行为,可能会产生不可预测的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/702728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习---- 前端HTML基本元素的介绍

一&#xff1a;显示相关的HTML基础知识 1. 推荐的前端编写工具 2. VScode的html速写规则&#xff08;从a标签开始再用&#xff09; ①、&#xff01;&#xff1a;代表生成html的基本框架元素 ②、html元素&#xff1a;直接书写html,不需要加<>,按回车会自动生成 ③、{}…

Java之线程池:线程池常用类、接口;线程池执行流程,配置参数,分类

线程池 什么是线程池&#xff1f; 线程池&#xff1a;一种基于池化思想管理和使用线程的机制 线程池常用类和接口 ExecutorService接口&#xff1a;进行线程池的操作访问Executors类&#xff1a;创建线程池的工具类ThreadPoolExecutor及其子类&#xff1a;封装线程池的核心参…

蓝桥杯备战刷题(自用)

1.被污染的支票 #include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main() {int n;cin>>n;vector<int>L;map<int,int>mp;bool ok0;int num;for(int i1;i<n;i){cin>>nu…

【技术分享】使用nginx完成动静分离➕集成SpringSession➕集成sentinel➕集成seata

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于技术点的相关分享吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 一、 使用nginx完成动静分离 1.下载…

JAVA毕业设计129—基于Java+Springboot+thymeleaf的物业管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootthymeleaf的物业管理系统(源代码数据库)129 一、系统介绍 本项目前后端分离&#xff0c;本系统分为管理员、小区管理员、用户三种角色 1、用户&#xff1a; 登…

一种简易的多进程文件读写器

目录 1. 前言2. 初步实现3. ParallelFileProcessor 1. 前言 在数据清洗场景下&#xff0c;我们可能需要对一个 .jsonl 文件清洗以得到另一个 .jsonl 文件。一种直观的做法就是逐行读取&#xff0c;逐行清洗&#xff0c;然后逐行写入&#xff0c;这一流程的示意图如下&#xff…

【wails】(6):使用wails做桌面应用开发,使用gin+go-chatglm.cpp进行本地模型运行,在windows上运行成功

1&#xff0c;整体架构说明 主要使用&#xff0c;参考的开源项目是&#xff1a; https://github.com/wailsapp/wails 前端项目&#xff1a; https://github.com/Chanzhaoyu/chatgpt-web 运行模型&#xff1a; https://github.com/Weaxs/go-chatglm.cpp 参考代码&#xff1a; h…

深度神经网络中的计算和内存带宽

深度神经网络中的计算和内存带宽 文章目录 深度神经网络中的计算和内存带宽来源原理介绍分析1&#xff1a;线性层分析2&#xff1a;卷积层分析3&#xff1a;循环层总结 来源 相关知识来源于这里。 原理介绍 Memory bandwidth and data re-use in deep neural network computat…

五.AV Foundation 视频播放 - 标题和字幕

引言 本篇博客主要介绍使用AV Foundation加载视频资源的时候&#xff0c;如何获取视频标题&#xff0c;获取字幕并让其显示到播放界面。 设置标题 资源标题的元数据内容&#xff0c;我们需要从资源的commonMetadata中获取&#xff0c;在加载AVPlayerItem的时候我们已经指定了…

Sentinel微服务流量治理组件实战上

目录 分布式系统遇到的问题 解决方案 Sentinel 是什么&#xff1f; Sentinel 工作原理 Sentinel 功能和设计理念 流量控制 熔断降级 Sentinel工作主流程 Sentinel快速开始 Sentinel资源保护的方式 基于API实现 SentinelResource注解实现 Spring Cloud Alibaba整合…

介绍 PIL+IPython.display+mtcnn for 音视频读取、标注

1. nn.NLLLoss是如何计算误差的? nn.NLLLoss是负对数似然损失函数&#xff0c;用于多分类问题中。它的计算方式如下&#xff1a;首先&#xff0c;对于每个样本&#xff0c;我们需要将其预测结果通过softmax函数转换为概率分布。softmax函数可以将一个向量映射为一个概率分布&…

第四节:Vben Admin登录对接后端getUserInfo接口

系列文章目录 第一节&#xff1a;Vben Admin介绍和初次运行 第二节&#xff1a;Vben Admin 登录逻辑梳理和对接后端准备 第三节&#xff1a;Vben Admin登录对接后端login接口 第四节&#xff1a;Vben Admin登录对接后端getUserInfo接口 文章目录 系列文章目录前言一、回顾Vben…

RK3568平台 阻塞IO和非阻塞IO

一.IO 模型的分类 IO 模型根据实现的功能可以划分为为阻塞 IO、非阻塞 IO、信号驱动IO&#xff0c;IO多路复用和异步 IO。根据等待 IO 的执行结果进行划分&#xff0c;前四个 IO 模型又被称为同步IO. 同步IO与异步IO&#xff1a; 以现实生活去餐馆吃饭为例&#xff0c;根据菜…

Linux——缓冲区封装系统文件操作

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、FILE二、封装系统接口实现文件操作1、text.c2、mystdio.c3、mystdio.h 一、FILE 因为IO相…

Typora结合PicGo + 使用Github搭建个人免费图床

文章目录 一、国内图床比较二、使用Github搭建图床三、PicGo整合Github图床1、下载并安装PicGo2、设置图床3、整合jsDelivr具体配置介绍 4、测试5、附录 四、Typora整合PicGo实现自动上传 每次写博客时&#xff0c;我都会习惯在Typora写好&#xff0c;然后再复制粘贴到对应的网…

基于springboot+vue的校园社团信息管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

自定义搭建管理系统

最近使用自己搭建的脚手架写了一个简易管理系统&#xff0c;使用webpackreactantd&#xff0c;搭建脚手架参考&#xff1a; 使用Webpack5搭建项目&#xff08;react篇&#xff09;_babel-preset-react-app-CSDN博客 搭建的思路&#xff1a; 1. 基建布局&#xff0c;使用antd的…

代码随想录算法训练营第二十五天 | 216.组合总和III,17.电话号码的字母组合 [回溯篇]

代码随想录算法训练营第二十五天 LeetCode 216.组合总和III题目描述思路参考代码总结 LeetCode 17.电话号码的字母组合题目描述思路参考代码 LeetCode 216.组合总和III 题目链接&#xff1a;216.组合总和III 文章讲解&#xff1a;代码随想录#216.组合总和III 视频讲解&#xff…

Java零基础 - 字符串连接运算符

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

acwing算法学习笔记 ------ 双链表

1、定义 这里可以做一个投机取巧&#xff0c;我们不再像单链表去用head去存头和尾&#xff0c;直接让r[0] 1,l[1] 0; idx 2.进行初始化&#xff0c; 解释一下l[N] 和 r[N] l[N]:是表示指向左面下一个节点下标&#xff0c; r[N]:表示指向下一个节点的下标。大家不用担心i…