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

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.mfbz.cn/a/409607.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

c语言经典测试题5

1.题1 t0; while(printf("*")) { t; if (t<3) break; }关于上述代码描述正确的是&#xff1f; A: 其中循环控制表达式与0等价 B: 其中循环控制表达式与0等价 C: 其中循环控制表达式是不合法的 D: 以上说法都不对 我们来分析一下&#xff1a;printf的返回值…

mac 安装hbuilderx

下载 HBuilderX下载地址: 下载地址 选额mac版本点击下载 安装 如图&#xff0c;将HBuilderX拖到Applications&#xff0c;才是正确的安装姿势。 MacOSX&#xff0c;软件必须安装到/Applications目录&#xff0c;如未安装到此目录&#xff0c;可能会出现插件安装失败、项目创建…

使用Django的admin功能管理数据_vscode

之前的文章 项目 hello_django, app名 hello&#xff0c;已有的model LogMessage&#xff1a; https://blog.csdn.net/weixin_44741835/article/details/136202771?spm1001.2014.3001.5502 参考得到电子书&#xff1a;第八章。 https://www.dedao.cn/ebook/reader?idrEQKv6…

深入理解指针2

各位小伙伴们&#xff0c;我们继续来学习指针&#xff0c;指针和结构体以及动态内存管理对后面的数据结构学习有非常大的帮助&#xff0c;所有我们一定要把这些知识点学会。OK,正式进入学习之旅吧 1.数组名的理解 在上⼀个章节我们在使⽤指针访问数组的内容时&#xff0c;有这…

thinkphp+vue+mysql学生宿舍水电费报修管理系统 0s7h5

本文首先实现了学生宿舍管理系统技术的发展随后依照传统的软件开发流程&#xff0c;最先为系统挑选适用的言语和软件开发平台&#xff0c;依据需求分析开展控制模块制做和数据库查询构造设计&#xff0c;随后依据系统整体功能模块的设计&#xff0c;制作系统的功能模块图、E-R图…

BL、万科、中海地产、碧桂园、华润置地、佳兆业、金地商置、龙湖、绿城、融创、时代中国、旭辉、中国建筑校招笔试题

为了帮助应聘者更好地备战地产公司的招聘考试&#xff0c;我将介绍以下13套校招试题资料&#xff0c;涵盖了24 BL、24万科、24中海地产、碧桂园、华润置地、佳兆业、金地商置、龙湖、绿城、融创、时代中国、旭辉和中国建筑等知名房地产企业&#xff0c;为您提供全方位的备考资源…

(Linux学习一):Mac安装vmWare11.5,centOS 7安装步骤教程

一。下载vmware 官网地址&#xff1a;下载地址 由于我的电脑系统是Mac 10.15.6版本系统&#xff0c;我下载的是VMware Fusion 11.5版本&#xff0c;13是最新版本不支持安装需要系统在11以上。 百度网盘下载地址: VMware Fusion 11 VMware Fusion 12 VMware Fusion 13 下载需要…

K—近邻算法实际应用案例

K—近邻算法实际应用案例 1. 案例1&#xff1a;鸢尾花种类预测1.1 数据集获取和属性介绍1.1.1 scikit-learn中的数据集介绍1.1.2 sklearn数据集返回值介绍 1.2 数据可视化介绍&#xff08;查看数据分布&#xff09;1.3 数据集的划分1.4 特征工程1.4.1 归一化1.4.2 标准化 1.5 鸢…

Vue 卸载eslint

卸载依赖 npm uninstall eslint --save 然后 进入package.json中&#xff0c;删除残留信息。 否则在执行卸载后&#xff0c;运行会报错。 之后再起项目。

Vue+SpringBoot打造高校实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

【vue3语法】开发使用创建项目等

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、vue3创建vue3v2函数式、v3组合式api响应式方法ref、reactive计算属性conputed监听属性wacthvue3 选项式生命周期父子通信父传子defineProps编译宏 子传父de…

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

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

2.23日学习总结

今天刚学的01背包&#xff0c;套模板就可以解决这道题。 #include<iostream> using namespace std; int n,m,f[13000],w[3410],v[3410]; int main() {cin>>n>>m;for(int i1;i<n;i)scanf("%d %d",&w[i],&v[i]);for(int i1;i<n;i)for…

第三节:Vben Admin登录对接后端login接口

系列文章目录 第一节&#xff1a;Vben Admin介绍和初次运行 第二节&#xff1a;Vben Admin 登录逻辑梳理和对接后端准备 文章目录 系列文章目录前言一、Flask项目介绍二、使用步骤1.User模型创建2.迁移模型3. Token创建4. 编写蓝图5. 注册蓝图 三. 测试登录总结 前言 上一节&…

1904_ARM Cortex M系列芯片特性小结

1904_ARM Cortex M系列芯片特性小结 全部学习汇总&#xff1a; g_arm_cores: ARM内核的学习笔记 (gitee.com) ARM Cortex M系列的MCU用过好几款了&#xff0c;也涉及到了不同的内核。不过&#xff0c;关于这些内核的基本的特性还是有些不了解。从ARM的官方网站上找来了一个对比…

皓学IT:WEB05-Servlet

一、Servlet 1.1.概述 Servlet是SUN公司提供的一套规范&#xff0c;名称就叫Servlet规范&#xff0c;它也是JavaEE规范之一。我们可以像学习Java基础一样&#xff0c;通过API来学习Servlet。这里需要注意的是&#xff0c;在我们之前JDK的API中是没有Servlet规范的相关内容&am…

k8s笔记26--快速实现prometheus监控harbor

k8s笔记26--快速实现prometheus监控harbor 简介采集指标&配置grafana面板采集指标配置grafana面板 说明 简介 harbor是当前最流行的开源容器镜像仓库项目&#xff0c;被大量IT团队广泛应用于生产、测试环境的项目中。本文基于Harbor、Prometheus、Grafana介绍快速实现监控…

H5多用途的产品介绍展示单页HTML5静态网页模板

H5多用途的产品介绍展示单页HTML5静态网页模板 源码介绍&#xff1a;一款H5自适应多用途的产品介绍展示单页HTML静态网页模板&#xff0c;可用于团队官网、产品官网。 下载地址&#xff1a; https://www.changyouzuhao.cn/13534.html

MYSQL安装及卸载

目录 一、下载 二、解压 三、配置 1. 添加环境变量 2. 初始化MySQL 3. 注册MySQL服务 4. 启动MySQL服务 5. 修改默认账户密码 四、登录MySQL 五、卸载MySQL 一、下载 点开下面的链接&#xff1a;MySQL :: Download MySQL Community Server 点击Download 就可以下载对…
最新文章