《计算机组成与设计》03. 计算机的算术运算

news2024/9/27 21:21:29

文章目录

    • 整数运算
      • 加法与减法
      • 乘法
        • 普通十进制乘法
        • 硬件中实现步骤
        • 例子
        • 乘法器的设计
      • 除法
        • 普通十进制除法
        • 硬件中实现步骤
        • 例子
        • 除法器的设计
    • 浮点数运算
      • 科学计数法、规格化数
      • 浮点表示
        • 单精度浮点数
        • 双精度浮点数
    • 移码表示法
    • IEEE 754
      • 指数偏移值(exponent bias)
      • 规格化的浮点数
      • 例子
        • 由十进制浮点数转为二进制浮点数 -0.75
        • 由二进制浮点数转为十进制浮点数
    • 浮点运算
      • 浮点加法减法
        • 步骤
        • 例子 —— 十进制 0.5 + 0.4375 使用二进制相加,假设保留 4 位精度。
      • 浮点乘法
        • 步骤
        • 例子 —— 求 0.5 和 -0.4375 的乘积,使用二进制。
    • 参考文献

整数运算

加法与减法

加减法不溢出的情况:

  • 加法:当不同符号的操作数相加时,不会发生溢出,因为总和一定不会大于其中一个的操作数。例如: − 10 + 4 = − 6 -10+4=-6 10+4=6
  • 减法:当符号相同的操作数相减时,不会发生溢出,因为总和一定不会大于其中一个的操作数。例如: − 10 − ( − 4 ) = − 10 + 4 = − 6 -10-(-4)=-10+4=-6 10(4)=10+4=6

加减法溢出的情况:假设字宽为 64 位,当加或减两个 64 位的数字可能产生一个需要 65 位才能表示的结果。也就是说符号位会错位,即符号位是错误值。

溢出发生时的各种情况组合:

image-20230201161208650

假设字宽为 8 位,即有符号数据范围为 -127~128
70+80
  01000110
+ 01010000
——————————
  10010110 = 150
150 达到上溢条件,因为有符号位,所以实际值为 -22

-70+(-80)
  10111010
+ 10110000
——————————
 101101010
超出 1 位,将最高位舍弃,保留 01101010,因此实际值位 106

无符号溢出检测:如果总和小于加数中的任何一个,则加法溢出,而如果差大于被减数,则减法溢出。

乘法

普通十进制乘法

image-20230201170055361

1000 × 1001 1000 \times 1001 1000×1001 都是十进制,第一个操作数为被乘数,第二个操作数为乘数,最后的结果为积。规律:每次从右到左选择乘数中的一位,用这一位乘上被成数,然后将所得到的中间结果相对于前一位的中间结果左移一位。

硬件中实现步骤

image-20230201170731383

例子

image-20230201171350162

乘法器的设计

image-20230201171026264

除法

普通十进制除法

image-20230201175906106

1001010 ÷ 1000 1001010 \div 1000 1001010÷1000 第一个操作是为被除数,第二个操作数为除数,结果称为商,随之产生附带结果叫做余数。它们之间个关系:
被除数 = 商 × 除数 + 余数 被除数 = 商 \times 除数 + 余数 被除数=×除数+余数

硬件中实现步骤

image-20230201210222886

例子

image-20230201210626200

除法器的设计

image-20230201210506862

浮点数运算

科学计数法、规格化数

0.000000001 = > 1.0 × 1 0 − 9 0.000000001 => 1.0 \times 10^{-9} 0.000000001=>1.0×109

3155760000 = > 3.15576 × 1 0 9 3155760000 => 3.15576 \times 10^9 3155760000=>3.15576×109

以上两种就是科学计数法表示形式,该记数法在小数点左边只有一个数字。

科学记数法中整数部分没有前导零的数字称为规格化数。例如 1.0 × 1 0 − 9 1.0\times 10^{-9} 1.0×109 是规格化数,但 0.1 × 1 0 − 8 0.1 \times 10^{-8} 0.1×108 10.0 × 1 0 − 10 10.0 \times 10^{-10} 10.0×1010 不是。

我们也可以像用科学记数法表示十进制一样来表示二进制:
( 0.1 ) 2 = > 1. 0 2 × 2 − 1 (0.1)_2 => 1.0_2 \times 2^{-1} (0.1)2=>1.02×21
Tips: 小数点左边必须只剩一个非零数。

浮点表示

单精度浮点数

image-20230210014310865

符号位数备注
S1表示该浮点数是否有符号。
E8指数,可以是负数的补码,偏移值为 127。
F23有效数位最左边的“1”一定存在,因此不存储该位,也就是说有效位是 24 位,实际存储 23 位。

通常可以这么表示:
( − 1 ) S × F × 2 E (-1)^S \times F \times 2^E (1)S×F×2E

双精度浮点数

image-20230201233631487

偏移值为: 2 10 − 1 = 1023 2^{10}-1=1023 2101=1023

通常可以这么表示(注意:和上面单精度只是写法不同,实际上是一样的):
( − 1 ) S × 2 E × 1. M (-1)^S \times 2^E \times 1.M (1)S×2E×1.M
fraction:小数部分(包含小数点)。
mantissa:尾数(小数点后面的数值)。

移码表示法

移码(英语:Offset binary)是一种将全0码映射为最小负值、全1码映射为最大正值的编码方案。通常对于n位二进制数,偏移量为 2 n − 1 2^n-1 2n1

移码在逻辑比较操作中可以得到和真值比较相同的结果,补码则当且仅当符号相同时逻辑比较操作的结果和真值比较相同,否则比较结果将颠倒(负值比正值大)。

例如:比较 120 和 -120 的大小。

 120 => 01111000 原码
-120 => 10001000 补码
二进制比较规则:从左到右依次比较,若一样则跳过该位,继续比较下一位,若某一方为 1 则大。
可以发现,得到的结果是 -120 > 120 错误结果,并不是我们想要的。

接下来对 -120 用移码表示,移码=原数的补码+偏移值

-120 移码:
= 10000000B + (-1111000B)
= 10000000B + (10001000B)
= 00001000B

Tips: 这样的移码也可以叫做偏移值为 128 的移码,也是标准移码,

最后再次进行比较:

 120 => 01111000 原码
-120 => 00001000 移码
得到正确结果 120 > -120

移码主要用于表示浮点数的阶码(即指数),在浮点数运算中有优势。

IEEE 754

指数偏移值(exponent bias)

IEEE 754 标准规定该固定值为 2 n − 1 − 1 2^{n-1}-1 2n11,n 是字宽。

单精度浮点数为例,它的指数域长度为 8,则固定值为 2 7 − 1 = 127 2^7-1=127 271=127,且该指数允许负数,则数据范围可取 [ − 126 , 127 ] [-126,127] [126,127](127 和 128 被用作特殊值处理)。

例如指数实际值为 17,那么在单精度浮点数指数域的编码值为 144,即 144 = 127 + 17 144 = 127 + 17 144=127+17

采用指数的实际值加上固定的偏移值的办法表示浮点数的指数,好处是可以用长度为个比特的无符号整数来表示所有的指数取值,这使得两个浮点数的指数大小的比较更为容易,实际上可以按照字典次序比较两个浮点表示的大小。(详细请看上面“移码表示法”)。

这种移码表示的指数部分,中文称作阶码

规格化的浮点数

若浮点数中的指数部分的编码值在 0 < E ( e x p o n e n t ) < = 2 n − 2 0 < E(exponent) <= 2^n -2 0<E(exponent)<=2n2 之间,且在科学表示法的表示下,分数部分最高有效位(即小数点左边)是 1,那么这个浮点数称为规格化浮点数

这个规格化浮点数可表示为:
( − 1 ) S × 1. M × 2 E − 偏移值 (-1)^S \times 1.M \times 2^{E-偏移值} (1)S×1.M×2E偏移值
在规格化的浮点数下,尾数中隐藏了一位二进制有效位,隐藏了“1”,为了与二进制科学记数法尾数区别,故而 IEEE 754 将 M 称之为有效位数(significant)。

科学记数法的补充:
尾数 × 底 数 指数 尾数 \times 底数^{指数} 尾数×指数
例如: 1.0 1 2 × 1 0 8 1.01_2 \times 10^8 1.012×108 中尾数便是 1.0 1 2 1.01_2 1.012,而 IEEE 754 中将 0 1 2 01_2 012 称为有效位数,而隐藏了小数点前面的 1 1 1

单精度规格化浮点数的指数值域为 00000001 到 11111110,分数部分(即小数点后面)则是 000…000 到 111…111(23-bit)。

**Tips:**为什么分数部分从 0 开始?因为规格化浮点数 1. M 1.M 1.M 隐藏了 1,只存储了 M M M

例子

由十进制浮点数转为二进制浮点数 -0.75

用二进制小数表示:
− 0.1 1 2 -0.11_2 0.112
用二进制科学记数法表示:
− 0.1 1 2 × 2 0 -0.11_2 \times 2^0 0.112×20
用二进制科学记数法的规格化形式表示:
− 1. 1 2 × 2 − 1 -1.1_2 \times 2^{-1} 1.12×21
接下来以单精度通常为例,计算指数:
E = 指数 + 偏移量 = − 1 + 127 = 126 E = 指数 + 偏移量 = -1 + 127 = 126 E=指数+偏移量=1+127=126
其单精度表示为:
( − 1 ) S × ( 1 + 0.1000   0000   0000   0000   0000   00 0 2 ) × 2 126 − 127 (-1)^S \times (1+0.1000\ 0000\ 0000\ 0000\ 0000\ 000_2) \times 2^{126-127} (1)S×(1+0.1000 0000 0000 0000 0000 0002)×2126127
所以 -0.75 的单精度二进制可表示为:

image-20230202165642959

另外,双精度可表示为:

image-20230202165738084

由二进制浮点数转为十进制浮点数

符号位:1,指数字段 126,尾数字段: 1 × 2 − 1 = 1 / 2 1 \times 2^{-1}=1/2 1×21=1/2,即 0.5。
KaTeX parse error: No such environment: eqnarray at position 8: \begin{̲e̲q̲n̲a̲r̲r̲a̲y̲}̲ & & (-1)^S \ti…

浮点运算

浮点加法减法

步骤

image-20230202173205910

例子 —— 十进制 0.5 + 0.4375 使用二进制相加,假设保留 4 位精度。

KaTeX parse error: Expected 'EOF', got '&' at position 6: 0.5 &̲ = & 1.000_2 \t…

第一步:将指数较小的数( − 1.11 0 2 × 2 − 2 -1.110_2 \times 2^{-2} 1.1102×22)的有效数位右移,直到其指数与较大的数相同。
− 1.11 0 2 × 2 − 2 = − 0.11 1 2 × 2 − 1 -1.110_2 \times 2^{-2} = -0.111_2 \times 2^{-1} 1.1102×22=0.1112×21
第二步:将有效位相加。
1.00 0 2 + ( − 0.11 1 2 ) = 0.00 1 2 1.000_2 + (-0.111_2) = 0.001_2 1.0002+(0.1112)=0.0012

1.00 0 2 × 2 − 1 + ( − 0.11 1 2 × 2 − 1 ) = 0.00 1 2 × 2 − 1 1.000_2 \times 2^{-1} + (-0.111_2 \times 2^{-1}) = 0.001_2 \times 2^{-1} 1.0002×21+(0.1112×21)=0.0012×21

第三步:对和进行规格化,并检查上溢和下溢。
0.00 1 2 × 2 − 1 = 1.00 0 2 × 2 − 4 0.001_2 \times 2^{-1} = 1.000_2 \times 2^{-4} 0.0012×21=1.0002×24
单精度指数的范围是 [ − 126 , 127 ] [-126, 127] [126,127],因为 − 126 < = − 4 < = 127 -126 <= -4 <= 127 126<=4<=127,所以指数合法。

第四步:对和进行舍入。

1.00 0 2 × 2 − 4 1.000_2 \times 2^{-4} 1.0002×24 符合保留 4 位精度的条件。

举个需要舍入的的例子,例如对 1.001 5 10 × 1 0 2 1.0015_{10} \times 10^2 1.001510×102 保留 4 位精度,现在 1.001 5 10 1.0015_{10} 1.001510 是 5 位精度,根据紧跟在第 4 位后一位的数值决定是舍还是入,得到的是 5 5 5,因此前 1 位进一得到 1.00 2 10 × 1 0 2 1.002_{10} \times 10^2 1.00210×102

所以和是:
KaTeX parse error: Expected 'EOF', got '&' at position 24: … \times 2^{-4} &̲ = & 0.0001000_…

浮点乘法

步骤

image-20230202182256016

例子 —— 求 0.5 和 -0.4375 的乘积,使用二进制。

KaTeX parse error: Expected 'EOF', got '&' at position 6: 0.5 &̲ = & 1.000_2 \t…

第一步:将两数移码相加。

第一种方式:不带偏移值,直接加。
− 1 + ( − 2 ) = − 3 -1 + (-2) = -3 1+(2)=3
第二种方式:使用移码相加,移码表示。
( − 1 + 127 ) + ( − 2 + 127 ) − 127 = ( − 1 − 2 ) + ( 127 + 127 − 127 ) = − 3 + 127 = 124 (-1+127)+(-2+127)-127=(-1-2)+(127+127-127)=-3+127=124 (1+127)+(2+127)127=(12)+(127+127127)=3+127=124
第二步:有效数位相乘。

image-20230202183403646

每个操作数小数点右侧有三位数字,因此乘积的小数点应该放在从右数第 6 位有效位前面:
1.11000 0 2 1.110000_2 1.1100002
但我们需要保留 4 位有效位:
1.11 0 2 1.110_2 1.1102
算上前面的指数,用二进制科学记数法表示就是:
1.11 0 2 × 2 − 3 1.110_2 \times 2^{-3} 1.1102×23
第三步:对结果规格化,然后检查已否溢出。

1.11 0 2 × 2 − 3 1.110_2 \times 2^{-3} 1.1102×23 已经是规格化的形式了,因此无需规格化。

− 3 -3 3 符合单精度指数 − 126 < = − 3 < = 127 -126<=-3<=127 126<=3<=127,因此没有溢出。

第四步:因为操作数为“异号得负”,因此将乘积的符号设为负。

所以,乘积为:
KaTeX parse error: Expected 'EOF', got '&' at position 25: … \times 2^{-3} &̲ = & -0.001110_…

参考文献

  • 移码
  • 单精度浮点
  • 双精度浮点
  • IEEE 754

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

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

相关文章

计算机网络4:计算机网络体系结构

目录计算机网络体系结构1.网络模型2.每一层的代表含义2.1 OSI7层模型2.2 五层协议2.3 TCP/IP 四层协议3.数据在各层之间的传输过程4.为什么要进行分层计算机网络体系结构 1.网络模型 2.每一层的代表含义 2.1 OSI7层模型 &#xff08;1&#xff09;物理层&#xff1a;比特流–…

STC15中断系统介绍

STC15中断系统介绍✨本篇参考来源于STC官方stc15系列手册:538页- 589页。&#xff08;文末提供该摘取部分的文档资料&#xff09; &#x1f389;在官方提供的手册资料中&#xff0c;一个系列一份手册&#xff0c;手册内容涵盖了数据手册和参考手册以及例程案例。对于学习着来说…

彻底搞懂分布式系统服务注册与发现原理

目录 引入服务注册与发现组件的原因 单体架构 应用与数据分离

火遍全球的ChatGPT技术简介与主干网络代码

如果说当下最火的AI技术和话题是什么&#xff0c;恐怕很难绕开ChatGPT。各大厂商都在表示未来要跟进ChatGPT技术&#xff0c;开发在自然语言处理智能系统&#xff0c;可见其影响力。本篇博客追个热度&#xff0c;来简单的介绍下ChatGPT到底是一项什么技术&#xff0c;究竟如何完…

深入理解innodb存储格式,双写机制,buffer pool底层结构和淘汰策略

MySql系列整体栏目 内容链接地址【一】深入理解mysql索引本质https://blog.csdn.net/zhenghuishengq/article/details/121027025【二】深入理解mysql索引优化以及explain关键字https://blog.csdn.net/zhenghuishengq/article/details/124552080【三】深入理解mysql的索引分类&a…

【网络编程】Java中的Socket

文章目录前言socket是什么&#xff1f;Java中的SocketJava实现网络上传文件前言 所谓Socket&#xff08;套接字&#xff09;&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用…

kafka入门篇

文章目录前言介绍概念与说明安装启动配置命令操作创建topic查看topic列表发送消息&#xff08;启动一个生产者&#xff09;消费消息&#xff08;启动一个消费者&#xff09;查询topic信息删除topic集群关机使用报错java连接示例前言 作为入门篇&#xff0c;主要是了解Kafka的概…

在windows下载安装netcat(nc)命令

参考文章 一、netcat(nc)下载 网盘下载 netcat(nc)下载地址&#xff1a;netcat 1.11 for Win32/Win64 二、配置环境变量 在Path里添加netcat的存放路径 参数 说明 -C 类似-L选项&#xff0c;一直不断连接[1.13版本新加的功能] -d 后台执行 -e prog 程序重定向&am…

能取代90%人工作的ChatGPT到底牛在哪?

&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3; &#x1f38d;大家好&#xff0c;我是慕枫 &#x1f38d;前阿里巴巴高级工程师&#xff0c;InfoQ签约作者、阿里云专家博主&#xff0c;一直致力于用大白话讲解技术知识 &#x…

Web 框架 Flask 快速入门(二)表单

课程地址&#xff1a;Python Web 框架 Flask 快速入门 文章目录&#x1f334; 表单1、表单介绍2、表单的简单实现1. 代码2. 代码的执行逻辑3、使用wtf扩展实现4、bug记录&#xff1a;表单验证总是失败&#x1f334; 表单 1、表单介绍 当我们在网页上填写账号密码进行登录的时…

Spring 面试题(一):Spring 如何处理全局异常?

❤️ 博客首页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;Spring 教程&#xff1a;从入门到精通 文章目录1、如何处理全局异常2、代码示例2.1、定义统一的“响应结果对象”2.2、…

Leetcode 回溯详解

回溯法 回溯法有“通用解题法”之称&#xff0c;用它可以系统地搜索问题的所有解。回溯法是一个既带有系统性又带有跳跃性的搜索算法。 在包含问题的所有解的解空间树中&#xff0c;按照深度优先搜索(DFS)&#xff09;的策略&#xff0c;从根结点出发深度探索解空间树。当探索…

MWORKS--同元软控MWORKS介绍、安装与使用

MWORKS--同元软控MWORKS介绍、安装与使用1 同元软控介绍1.1 同元软控简介1.2 同元软控发展历史2 MWORKS介绍2.1 MWORKS简介2.2 MWORKS产品描述3 装备数字化3.1 发展3.2 内涵3.3 系统模型发展成为产品的一部分3.4 MWORKS系统模型数据管理3.4 MWORKS为装备数字化提供的套件参考1 …

springcloud集成seata(AT)分布式事务

目录 一、 下载seata server和seata源码 二、配置启动seata 2.1 在nacos控制台&#xff0c;新建一个seata的名称空间&#xff0c;用于存放seata的专用配置 2.2 创建seata server的mysql库 2.3 在nacos上配置seata相关配置 &#xff08;seata名称空间&#xff09; 2.4 启动…

家政服务小程序实战教程08-宫格导航

小程序一般会在首页显示商品的分类&#xff0c;这类需求我们在微搭中是使用宫格导航组件来实现。 01 组件说明 宫格导航组件可以在导航配置里设置菜单&#xff0c;可以手动添加&#xff0c;也可以变量绑定 因为我们一般的分类是动态变化的&#xff0c;品类会不断的调整&#…

阿里代码规范插件中,Apache Beanutils为什么被禁止使用?

在实际的项目开发中&#xff0c;对象间赋值普遍存在&#xff0c;随着双十一、秒杀等电商过程愈加复杂&#xff0c;数据量也在不断攀升&#xff0c;效率问题&#xff0c;浮出水面。 问&#xff1a;如果是你来写对象间赋值的代码&#xff0c;你会怎么做&#xff1f; 答&#xf…

[Java 进阶面试题] CAS 和 Synchronized 优化过程

最有用的东西,是你手里的钱,有钱就有底气,还不快去挣钱~ 文章目录CAS 和 Synchronized 优化过程1. CAS1.1 CAS的原理1.2 CAS实现自增自减的原子性1.3 CAS实现自旋锁1.4 CAS针对ABA问题的优化2. synchronized2.1 synchronized加锁阶段分析2.2 synchronized优化CAS 和 Synchroniz…

nodejs+vue大学生在线选课系统vscode - Visual Studio Code

3、数据库进行设计&#xff0c;建立约束和联系。 4、创建程序框架&#xff0c;代码分成三层结构&#xff1a;接口层、业务层、表示层&#xff0c;设计窗口和主窗口&#xff0c;主窗口菜单项依照系统模块图设计。 5、设计数据访问的接口&#xff0c;供各模块调用。完成登录功能…

【JavaWeb项目】简单搭建一个前端的博客系统

博客系统项目 本项目主要分成四个页面: 博客列表页博客详情页登录页面博客编辑页 该系统公共的CSS样式 common.css /* 放置一些各个页面都会用到的公共样式 */* {margin: 0;padding: 0;box-sizing: 0; }/* 给整个页面加上背景 */ html, body{height: 100%; }body {backgrou…

printf的返回值

参考资料 点击下面的链接https://legacy.cplusplus.com/reference/cstdio/printf/?kwprintf, 返回值的理解 如果返回成功后&#xff0c;将返回写入的字符总数。 如果发生写入错误&#xff0c;则设置错误指示器&#xff08;ferror&#xff09;并返回负数。 如果在写入宽字符…