【计算机组成原理】详细解读无符号整数的表示与运算

2024-09-06 11:12

本文主要是介绍【计算机组成原理】详细解读无符号整数的表示与运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

定点数的编码表示与运算

  • 导读
  • 一、无符号整数
    • 1.1 无符号整型的取值范围
    • 1.2 数据在内存中的存储
    • 1.3 小结
  • 二、无符号整数的运算
    • 2.1 无符号整数的加法
    • 2.2 无符号整数的减法
    • 2.3 小结
  • 结语

封面

导读

大家好,很高兴又和大家见面啦!!!

在上一篇内容中我们介绍了BCD码的相关内容:

  • BCD码是用二进制编码的十进制数,通常用4位二进制数表示一位十进制数码;
  • 8421码是一种有权码,二进制数位从高到低对应的权值为 8 、 4 、 2 、 1 8、4、2、1 8421 ;
  • 8421码在进行加法运算时,需要对无效码进行+6修正
  • 余3码是在8421码的基础上加3得到的一种无权码
  • 2421码是一种不同于8421的有权码,二进制数位从高到低对应的权值为 2 、 4 、 2 、 1 2、4、2、1 2421 ;
  • 2421码在进行加法运算时,需要对每一组无效码进行± ( 0110 ) 2 (0110)_2 (0110)2 的修正
  • 涉及到运算时,最好通过十进制数码完成运算后,再对其结果进行转码

BCD码的内容我们仅需了解即可,也不必过分深究。

在今天的内容中,我们将学习计算机中的整数的表示与运算,在学习C语言的过程中,我们知道了整数可以按照有无符号分为有符号整数与无符号整数。

从今天的内容开始,我们将会通过几章的内容来深入探讨有符号整数与无符号整数的表示方式以及运算方式。今天作为开篇,我们将会探讨相对简单的无符号整数的相关内容,接下来让咱们一起进入正题吧!!!

一、无符号整数

有符号与无符号整数对于掌握了C/C++的朋友应该是不陌生了,但是对于一些跨专业且还没有开始学习编程语言的朋友来说可能不太好理解。

下面我先给出一个最直观的理解,有符号无符号指的是数据在内存中所能够表示的数据范围。

以一个整型的数据为例,有符号整型的数据范围是 2 − 31 ~ 2 31 − 1 2^{-31}~2^{31}-1 2312311 ,而对应的无符号整型的数据范围则是 0 ~ 2 32 − 1 0~2^{32}-1 02321

1.1 无符号整型的取值范围

在C语言中,有符号整型的最大值与最小值以及无符号整型的最大值都存放在头文件<limits.h>中,我们可以通过引用头文件来获取对应的整型最值,如下所示:

无符号整型的表示
这里有朋友可能会好奇为什么最大值+1会得到最小值?

要回答这个问题,那我们就需要再回顾一下计算机结构的知识点了。

1.2 数据在内存中的存储

在计算机的硬件中,负责数据存储的是存储器这一硬件,而存储器又分为主存储器和辅助存储器。计算机系统中的存储器是主存储器,也就是我们所说的内存。

在冯·诺依曼的基本思想中,指令和数据均是由二进制代码表示,而在主存储器中,这些二进制代码都被存放在存储体中;

主存储器的工作方式是按照存储体中各个存储单元的地址进行存取,MAR就是负责寻址的寄存器,它的长度与程序计数器(PC)的长度一致,并且MAR中二进制的位数与存储体中存储单元的个数有关。

MAR的长度为8位,即能够存放8个比特位,那么对应的存储体中的存储单元的个数就是 2 8 = 256 2^8=256 28=256 个;

MDR这个寄存器则是用来存放数据的,它的长度则与存储字长相等,如当存储字长为8位时,MDR的长度也为8位,即能够存放长度为8比特位的信息,那么能够存储的整数的数据范围则是:

  • 有符号整数: − 2 7 ~ 2 7 − 1 -2^7~2^7-1 27271 − 128 ~ 127 -128~127 128127
  • 无符号整数: 0 ~ 2 8 − 1 0~2^8-1 0281 0 ~ 255 0~255 0255

当存入MDR的数据信息长度超过8个比特位时,那么多余的部分则会直接被舍弃,这样就会照成一个结果,数据会被截断,保留的是低位,舍弃的是高位。

也就是说对于256这个数据,其对应的二进制序列为: ( 1 − 0000 − 0000 ) 2 (1-0000-0000)_2 (100000000)2 存储器中能够被保留下来的是前8位二进制数,即 ( 0000 − 0000 ) 2 (0000-0000)_2 (00000000)2 ,该二进制数对应的数值为0;

而在无符号整数中,当存储的数值为最大值的情况就是对应长度中的所有二进制位都为1,在无符号整型中,对应的二进制为共32个比特位,即这32个比特位存储的数据都是1,其二进制序列为:
( 1111 − 1111 − 1111 − 1111 − 1111 − 1111 − 1111 − 1111 ) 2 (1111-1111-1111-1111-1111-1111-1111-1111)_2 (11111111111111111111111111111111)2
根据按权展开相加得到的对应数值为: 4 , 294 , 967 , 295 4,294,967,295 4,294,967,295

当我们给该数值再加上一个1后,其数值大小则变成了 4 , 294 , 967 , 296 4,294,967,296 4,294,967,296 ,该数值对应的二进制数为: ( 1 − 0000 − 0000 − 0000 − 0000 − 0000 − 0000 − 0000 − 0000 ) 2 (1-0000-0000-0000-0000-0000-0000-0000-0000)_2 (100000000000000000000000000000000)2

而该二进制数在寄存器中真正能够被存储下来的只有前面的32个比特位,即:
( 0000 − 0000 − 0000 − 0000 − 0000 − 0000 − 0000 − 0000 ) 2 (0000-0000-0000-0000-0000-0000-0000-0000)_2 (00000000000000000000000000000000)2
该二进制数对应的数值大小为0。

因此我们便得到了最大值+1为最小值的结论。该结论在有符号整型中同样适用,这个我们在后面的内容中会再详细介绍,这里就不再展开。

PS:
这里展示的二进制数之所以用'-'隔开是为了帮助大家更好的计算二进制数的长度,没有其它特别的含义。

1.3 小结

在无符号整数中,我们可以得到以下结论:

  1. 在存储字长为n的机器中,无符号整数的取值范围是: 0 ~ 2 n − 1 0~2^n-1 02n1
  2. 在无符号整数中,二进制位全为0时为最小值,二进制位全为1时为最大值;
  3. 当在存储字长为n的机器中存储长度 > n >n >n 的数据时,数据会从低位开始进行存储,并只保留前n位,超出的部分将会被舍弃,因此在无符号整数中最大值+1可以得到最小值;

现在我们对无符号整型和有符号整型有了一个初步的认识——它们的区别就是数据的取值范围不同。

那现在问题来了,在计算机中,无符号整数具体是如何进行运算的呢?下面我们接着进行探讨;

二、无符号整数的运算

在今天的内容中,我们主要探讨的是无符号整数的加法和减法是如何通过硬件实现的,对于乘法与除法,目前我们不需要去深究。下面我们就分别来看一下无符号整数的加法与减法的原理;

2.1 无符号整数的加法

无符号整数的加法实现还是比较简单的,其加法规则为:

  • 从最低位开始,按位相加,逢二进一

就比如现在我们要进行 ( 01010101 ) 2 (01010101)_2 (01010101)2 ( 00111111 ) 2 (00111111)_2 (00111111)2 这两个无符号整数的加法,其对应的运算过程如下所示:

无符号整数的运算
那具体是不是呢?下面我们通过该式子对应的十进制算式来进行验证;

根据按权展开相加法,我们不难得到:

  • ( 01010101 ) 2 = 0 × 2 7 + 1 × 2 6 + 0 × 2 5 + 1 × 2 4 + 0 × 2 3 + 1 × 2 2 + 0 × 2 1 + 1 × 2 0 = 64 + 16 + 4 + 1 = ( 85 ) 10 (01010101)_2 = 0×2^7+1×2^6+0×2^5+1×2^4+0×2^3+1×2^2+0×2^1+1×2^0=64+16+4+1=(85)_{10} (01010101)2=0×27+1×26+0×25+1×24+0×23+1×22+0×21+1×20=64+16+4+1=(85)10
  • ( 00111111 ) 2 = 0 × 2 7 + 0 × 2 6 + 1 × 2 5 + 1 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0 = 32 + 16 + 8 + 4 + 2 + 1 = ( 63 ) 10 (00111111)_2 = 0×2^7+0×2^6+1×2^5+1×2^4+1×2^3+1×2^2+1×2^1+1×2^0=32+16+8+4+2+1=(63)_{10} (00111111)2=0×27+0×26+1×25+1×24+1×23+1×22+1×21+1×20=32+16+8+4+2+1=(63)10
  • ( 10010100 ) 2 = 1 × 2 7 + 0 × 2 6 + 0 × 2 5 + 1 × 2 4 + 0 × 2 3 + 1 × 2 2 + 0 × 2 1 + 0 × 2 0 = 128 + 16 + 4 = ( 148 ) 10 (10010100)_2 = 1×2^7+0×2^6+0×2^5+1×2^4+0×2^3+1×2^2+0×2^1+0×2^0=128+16+4=(148)_{10} (10010100)2=1×27+0×26+0×25+1×24+0×23+1×22+0×21+0×20=128+16+4=(148)10

对应的十进制数值的加法运算 ( 85 ) 10 + ( 63 ) 10 = ( 148 ) 10 (85)_{10}+(63)_{10}=(148)_{10} (85)10+(63)10=(148)10 ,因此该运算方法是正确的。

2.2 无符号整数的减法

在计算机中,当我们要实现无符号整数的减法时,实际上还是通过加法来实现的,就比如十进制算式: 8 − 5 = 8 + ( − 5 ) 8-5=8+(-5) 85=8+(5) ,为了因此为了实现减法操作,计算机会在进行减法操作时,先将减数进行特殊处理后,再通过加法规则来完成减法操作。

当我们要计算 A − B A - B AB 时, 这里需要注意的几个点是:

  1. A A A 是被减数, B B B 是减数;
  2. B B B 在进行减法操作前,需要进行全部二进制位的按位取反再加1的特殊处理
  3. 在执行减法时,实际上执行的是 A + ( ~ B + 1 ) A+(~B+1) A+(B+1) ,这里的 '~' 是C语言中的按位取反操作符

下面我们通过一组实例来进一步理解这个过程。如我们要计算 ( 10010100 ) 2 − ( 01010101 ) 2 (10010100)_2-(01010101)_2 (10010100)2(01010101)2 ,介绍加法时,我们已经介绍过了,这里实际上计算的是 ( 148 ) 10 − ( 85 ) 10 (148)_{10}-(85)_{10} (148)10(85)10 其结果应该是 ( 63 ) 10 (63)_{10} (63)10 对应的二进制数为 ( 00111111 ) 2 (00111111)_2 (00111111)2 ,下面我们就来按照实际的计算过程来验证一下:

无符号整数的运算2
可以看到运算结果是没问题的。

现在可能就有朋友好奇了,为什么计算机实现一个减法操作还需要将其转化为加法呢?

这个问题的答案仅仅是为了省钱。因为实现一个加法电路比实现一个减法电路的造价要低很多,因此仅仅通过一些处理将减法转换为加法的话,从研发成本的角度来看,可以极大的节省研发成本。

之所以在整个转化过程中是将减数进行按位取反再加一,这个问题我们目前不再继续深究,等到以后学习数论后,会再给大家进行详细的介绍。

2.3 小结

现在无符号整型的运算我们也就给大家介绍完了,下面我们简单的总结一下这块内容的知识点:

  1. 无符号整数的加法规则:从最低位开始,依次相加,逢二进一
  2. 无符号整数的减法规则:
    • 转化减数——减数按位取反再加1
    • 执行加法——被减数+(~减数+1)
  3. 将减法操作转换为加法的原因:加法电路的造价更低,能够更好的降低研发成本

结语

在今天的内容中我们介绍了无符号整数的表示与运算:

  • 无符号整数在计算机中以二进制的形式存储在内存中
  • 对于存储子长为n的机器来说,能够存储的无符号整数的数值范围为: 0 ~ 2 n − 1 0~2^n-1 02n1
  • 当存储长度超过存储长度的数据时,前n位将会被保留,超出的高位部分将会被舍弃
  • 无符号整数的加法与减法都是以加法的形式实现
  • 无符号整数的加法规则:从最低位开始,依次相加,逢二进一
  • 无符号整数进行减法时,需要将减数进行按位取反再加1的转化

今天的内容到这里就全部结束了,在下一篇内容中我们将介绍《有符号整数》的相关内容,大家记得关注哦!如果大家喜欢博主的内容,可以点赞、收藏加评论支持一下博主,当然也可以将博主的内容转发给你身边需要的朋友。最后感谢各位朋友的支持,咱们下一篇再见!!!

这篇关于【计算机组成原理】详细解读无符号整数的表示与运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141841

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu