【计算机组成原理】加减运算和溢出判断

加减运算可以分为原码和补码两种方式。
(默认8位二进制运算)

原码的加法与减法

被加数和加数有四种可能出现的结果:

正+正、正+负、负+正、负+负

被减数和减数有四种可能出现的结果:

正-正、正-负、负-正、负-负

正+正 、负+负

使用绝对值进行相加、但结果不同。

正数相加为正数、负数相加为负数。需要改变符号位的正负表示。

结果可能会溢出

正+负、负+正

使用绝对值大的数减去绝对值小的数。符号和绝对值大的数相同。

正-负 、负-正

正数减负数:将负数取绝对值,然后相加

负数减正数:将正数取相反数,然后相加

负-负、正-正

负减负:将减数取绝对值进行相加操作

正减正:将减数取相反数进行相加操作

补码的加法与减法

设机器字长为8位(含一号符号位),A=15,B=-24,求[A+B]和[A-B]

​ 原码 补码

A=+1111 -> 00001111 -> 00001111

B=-11000 -> 10011000 -> 11101000

-B = +11000 -> 00011000 -> 00011000

[A+B] = [A] + [B] = 00001111 + 11101000 = 11110111

该补码的原码为 10001001 :-9

负数补码转化原码:

1、数值位取反加一

2、最右边的一及其右边不变,左边的数值位取反。

[A-B] = [A] + [-B] = 00001111 + 00011000 = 00100111

该补码的原码为 :00100111=39

溢出判断

符号位变化即发生溢出

若C为124.求 [A+C]和[B-C]

[A+C]: 00001111 + 01111100 = 10001011 真值为-117溢出(应为139

[B-C]: 11101000 + 10000100 = 01101100 真值为+108溢出(应为-148

8位补码表示:-128~127

若两个正数相加超过127变为负数或两个负数相加低于-128变为正数就会发生上溢和下溢。

方法一

使用A表示被加数的正负、B表示加数的正负、S表示结果的正负。溢出逻辑表达式为:

V = AB[S] + [A][B]S

若V=0,表示无溢出。

若V=1,表示有溢出。

逻辑与,都为1才为1

逻辑或,都为0才为0

逻辑非,相反

方法二

根据进位情况判断是否发生溢出。

若符号位为0,数值位往符号位进1,发生上溢。

若符号位为1,数值位往符号位进0,发生下溢。

异或结果为1表示有溢出,为0表示没有溢出。

方法三(重要一些)

双符号位表示数据(实际只存储一种符号位,运算时会复制一个符号位)

正数符号位为00,负数符号位为11。

若为01发生上溢,若为10发生下溢。

双符号位:模4补码

单符号位:模2补码

符号扩展

将数据从int转为long:

正数:

0,1011010

只需要在前面补0

0,000000001011010

原码反码补码都一样

负数:

原:1,1011010 在1后面补8个0 , 1,000000001011010

反:1,0100101 在1后面补8个1 , 1,111111110110101

补:1,0100110 在1后面补8个1,1,111111110110110

正小数:

原码反码补码都一样

尾部补0

0.1011010 -> 0.101101000000000

负小数:

原:1.1011010 在后面补8个0 , 1.101101000000000

反:1.0100101 在后面补8个1 , 1,011010111111111

补:1.0100110 在后面补8个0,1.011011000000000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值