《计算机组成原理》----2.4 有符号整数

2.4 有符号整数

尽管负数可以用很多种不同的方式表示,但计算机设计者选择了3种方法:符号及值表示法,二进制补码表示法,移码表示法。每种方法都有其各自的优点和缺点。

2.4.1 符号及值表示法

一个n位字可以表示从0~2n-1共2n个可能的值。例如,用一个8位的字可以表示0,1,…,254,255。表示负数的一种方法是用它的最高位表示符号。通常符号位为0表示正数,符号位为1表示负数。
有符号数的值可被表示为(-1)S×M,这里S为数的符号位的值,M为其数值部分。若S=0,则(-1)0=+1,该数为正数。如果S=1,则(-1)1=-1,该数为负数。例如,下面两个8位有符号二进制数00001101和10001101的值为

n位有符号的表示范围为-(2n-1-1)至+(2n-1-1)。一个8位有符号数可以表示-127(11111111)至+127(01111111)之间的整数。有人反对该系统的一个原因是它有两个值都表示0:
00000000 = +0 以及 10000000 = -0
符号及值表示法并没有被用于整数算术运算中,因为它的加、减法运算分别用加法器和减法器实现。很快我们就会看到另外一些只需使用加法器的负数表示方法。符号及值表示法用于浮点算术运算中。

2.4.2 二进制补码运算

微处理器用二进制补码系统表示有符号整数,因为它可以将减法运算转换为对减数的补数的加法运算。用7加上5的补数就可以完成运算7减去5。

一个n位二进制数N的二进制补码定义为2n-N。如果N = 5 = 00000101(8位二进制数),则N的补码为28 - 00000101 = 100000000-00000101=11111011。注意,11111011也可以代表-00000101(-5)或+123,这取决于我们是将二进制数11111011看作补码还是非符号整数。

下面的例子说明了8位二进制数的补码运算过程。首先我们将4个数+5,-5,+7和-7转换为补码。
+5=00000101   –5=11111011   +7=00000111   –7=11111001
现在将7与5的互补数相加,

00000111      7
  • 11111011 –5
    100000010 2

结果为9位二进制数100000010。如果忽略最左边一位(也叫“进位位”),结果为000000102= +2,这正是我们所希望看到的结果。下面来看看–7加5,

00000101      5
  • 11111001 –7
    11111110 –2
    结果为11111110(进位位为0)。我们预期的结果为-2;即28-2=10000000-00000010 =

11111110。我们再一次得到了所需要的结果。
二进制补码算术可不是魔术。请考虑n位二进制算术运算Z=X-Y,我们用X加上Y的补数来完成这一运算。Y的补码为2n-Y,则有Z=X+(2n-Y)=2n+(X+Y)。

换句话说,我们得到了所需要的结果,X-Y,以及位于最左边的一个并不需要的进位(即2n),而这个进位被丢弃了。

对一个数两次求补将得到这个数本身;例如,-5=28-00000101=11111011。再次求补,我们将得到:-(-5)=10000000-11111011=00000101=5。即-x=2n-x且-(-x)=2n-(2n-x)= x。请考虑下面的加法实例,它涵盖了被加数与加数分别为正和为负时全部四种可能的情形。

将结果视为补码时,所有4个例子都得到了我们所期望看到的结果。例3将6与9的补数相加完成运算-9+6,得到-3。-3的补码为10000000 - 00000011 = 11111101。

例4计算-X + -Y,得到-15,但这是一个模2n加法的结果。-15的补码为10000000 - 00001111 = 11110001。当两个数都是负数时,有(2n-X)+(2n-Y)=2n+(2n-X-Y)。这个表达式的第一部分是模2n加法时冗余的2n,第二部分为-X-Y的互补数。对于正数和负数加法的所有情形,补码都可以得到正确的结果。

1.求补运算
如果不是因为求补运算非常简单,补码不会有这样的吸引力。请考虑一个n位二进制补码数N,它被定义为2n-N。将表达式2n-N变为下面的形式:
2n-1-N+1=111...1-N+1

例如,8位(n=8)时有
``28-N=100000000-N=100000000-1-N+1(调整后)
=11111111-N=1``
表达式11111111-N的值很容易计算。对于N的第i位,ni,若ni = 0,则1-0=1。同样,若ni=1,则1-1=0。显然1-ni=ni。可见计算N的补码非常容易,所要做的就是将N的每一位取反并将结果加1。例如,对于下面的5位二进制数有

-7=00111+1=11000+1=11001```
这种求补码的方法的优点在于它很适合用硬件实现。

2.补码的特点
1)补码是一个真正的互补系统,因为+X + (-X) = 0。
2)补码0被表示为00…0,是唯一的。
3)补码的最高位为符号位。如果符号位为0,则该数为正;符号位为1,则该数为负。
4)n位二进制补码数的表示范围为-2n-1~2n-1-1。对于n=8,补码表示范围为-128~127。共有28=256个不同的数(128个负数,1个0,127个正数)。
5)补码加法和减法使用同样的硬件完成,因为补码减法由被减数加上减数的补数实现。

3.运算溢出
n位二进制补码数的表示范围为-2n-1~2n-1-1。如果破坏了这个规则,即运算结果位于这个范围之外,会发生什么?5位有符号二进制补码数的表示范围为-16~+15。请考虑下面的例子,

![QQ_20170526171913](https://yqfile.alicdn.com/2412e4dcda29c3ef6fad6b894d1847d82ef0d470.png)

情形1中,我们得到了期望的结果+1210,但情形2中,我们得到的结果为负数,因为它的符号位为1。如果将结果视作无符号数,它将是+25,这个值显然是正确的。然而,既然我们已经选择补码作为负数的表示方法,所有运算结果都必须有一个合理的解释。

同样,如果两个负数相加且结果小于-16,也会超出5位二进制补码的表示范围。例如,将-9=101112与-12=101002相加,得到

![QQ_20170526171932](https://yqfile.alicdn.com/eb6d23b96e27ce880b8aba70ee7b0691ddfe0acd.png)

这两个例子都说明了什么是运算溢出,它发生在补码加法当两个正数的和为负数,或两个负数的和为正数的时候。如果操作数A和B的符号位相同但结果的符号位与它们不同,则发生了溢出。假设A的符号位为an-1,B的符号位为bn-1,A与B之和的符号位为sn-1,则可以用下面的逻辑表达式判断是否溢出(下节将介绍逻辑表达式)。

![QQ_20170526171956](https://yqfile.alicdn.com/2f45944b61d41406b91111eac3e96c023707756e.png)

实践中,真实系统通过加法器的进位输入和输出的最高位来判断是否发生溢出,即V=Cin ≠ Cout。溢出是补码运算的结果,不应与进位混淆,是否产生进位由被加数与加数的最高两位之和决定。
时间: 2024-10-27 20:41:46

《计算机组成原理》----2.4 有符号整数的相关文章

计算机 组成原理-计算机组成原理 浮点数的知识

问题描述 计算机组成原理 浮点数的知识 想要学习这门课,可是被浮点数难倒了,哪位可以给我讲讲浮点数到底是怎么来的? 里面的阶码,尾数的是怎么运算的? 还有怎么和十进制之间转换? 解决方案 科学计数法懂么?任何一个数,都可以表示为(-)0.xxxx * 10 ^ (-)n的形式 比如 1200 3.14 -0.00123 分别可以表示为 0.12 * 10^4 0.314 * 10^1和 -0.123 * -10^2 总之,我们可以用4个变量表示一个数,符号 尾数 指数的符号 指数,比如 -0.1

基础野:细说有符号整数

Breif  本来只打算理解JS中0.1 + 0.2 == 0.30000000000000004的原因,但发现自己对计算机的数字表示和运算十分陌生,于是只好恶补一下.  本篇我们一起来探讨一下基础--有符号整数的表示方式和加减乘除运算.   Encode   有符号整数可表示正整数.0和负整数值.其二进制编码方式包含 符号位 和 真值域.   我们以8bit的存储空间为例,最左1bit为符号位,而其余7bit为真值域,因此可表示的数值范围是{-128,...,127},对应的二进制补码编码是{

32位有符号整数 ‘32位’和‘有符号’分别怎么理解

问题描述 32位有符号整数'32位'和'有符号'分别怎么理解 解决方案 解决方案二:32个二进制位带有正负符号解决方案三:既然称其为有符号整数,二进制知道有符号数用1表示负数,0代表正数把解决方案四:引用2楼chinajiyong的回复: 既然称其为有符号整数,二进制知道有符号数用1表示负数,0代表正数把 况且有符号数表示的范围也比无符号数宽啊比如32位机int取值范围是-2^31~2^31-1而无符号数取值范围是0~2^31-1解决方案五:回去翻翻计算机基础,上面讲的很明白(源码.反码和补码这

《计算机组成原理》----导读

目 录 第一部分 起始篇第1章 计算机系统体系结构1.1 什么是计算机系统体系结构1.2 体系结构和组成1.2.1 计算机系统和技术1.2.2 计算机体系结构在计算机科学中的地位1.3 计算机的发展1.3.1 机械计算机1.3.2 机电式计算机1.3.3 早期的电子计算机1.3.4 微机和PC革命1.3.5 摩尔定律和进步的历程1.3.6 存储技术发展1.3.7 普适计算1.3.8 多媒体计算机1.4 存储程序计算机1.4.1 问题描述1.4.2 解决方法1.4.3 构造一个算法1.4.4 计算

《计算机组成原理》----2.6 浮点数

2.6 浮点数 介绍了整数之后,下一步就是讨论浮点运算,即实数之间的运算.实数是所有有理数和无理数的集合.浮点运算能够让人们处理科学应用(与金融或商业应用相对)中很大的和很小的数.浮点运算不像整数运算,它的计算结果一般是不确定的.一块芯片上的浮点计算结果也许与另一块芯片上的不同.后面将解释为什么浮点运算无法获得确定的答案,并讨论一些程序员必须了解的陷阱. n位字长的计算机能够处理值为0-2n-1的单字长无符号整数.更大的整数可以通过将多个字链接在一起来表示.例如,一台32位的计算机可以将两个32

计算机组成原理的那些事儿

问题描述 计算机组成原理的那些事儿 计算机组成原理(唐朔飞)中,关于原码,补码,都是给出了定义式的求法...原码的定义式求法中,并没有包括-1,想问:::-1的原码到底存不存在? 解决方案 位比如说是8位整数,那么-1的原码是10000001 最高位1,其它位和1的原码相同. 解决方案二: 计算机组成原理计算机组成原理计算机组成原理

《计算机组成原理》----2.8 浮点运算和程序员

2.8 浮点运算和程序员 整数操作是精确.可重复的.例如,在所有计算机上计算整数乘积x·y都会得到同样的结果.一台计算机上浮点单元的精度可能与另一个台上的不同,尽管IEEE浮点标准的引入已经大大改善了这一情况. 不能总是向用户隐藏浮点运算的细节(即浮点数精度以及表达式的计算方式),因为用户必须了解这些.通常,用户有关浮点的一些考虑仅会影响那些高度专用的数字应用:没有几个程序员为正在飞向火星的飞船精确地修正过路线.另一方面,有些情况下,问题本身会放大浮点误差的影响.例如,当所有卫星几乎都在线时,用

计算机组成原理:cpu

cpu,中文名称中央处理单元,central processing unit.系统的核心,用于数据的处理,算术以及逻辑运算和控制程序的执行. 计算机组成原理:cpu-"> 组成 运算器 从字面上就可以理解到,运算器主要用来对于逻辑运算和算术运算. 在运算器中又由算术逻辑单元,累加寄存器,数据缓冲寄存器,状态寄存器 见图

计算机组成原理实验报告册上的问题

问题描述 计算机组成原理实验报告册上的问题 如何构建功能更强大的运算器如,何构建功能更强大的运算器如何构建功能更强大的运算器 解决方案 根据教材,吃透教材 解决方案二: 计算机实验报告