有符号数与无符号数的加减法

声明
本博文源自:原文链接已失效,现已不引用了
在此感谢博主!


一.有符号数的加减法
1、符号数与无符号数的人为规定性:一个数是有符号还是无符号数都是人为规定的。进行二进制运算时用无符号数或是补码运算时,结果都是正确的。0b10000100 + 0b00001110 若规定为无符号数,即 132+14=146 。若规定为有符号数,则为 -124 + 14 = -110,而[-110]补= 0b10010010。解释:0b10000100 是 -124 的补码,0b00001110 是 14 的补码,在机器中运算后得出的结果是 [-110] 的补码。机器中的有符号数运算一般就是补码运算。

2、补码加减法运算:计算机中,当确定为有符号数运算时,符号数一律用补码表示,运算时符号位和数字位一起参加运算。运算结果也用补码表示。

  • 两符号数相加公式:[X+Y]补=[X]补 + [Y]补
  • 两符号数相减公式:[X-Y]补 = [X]补 + [-Y]补

例子:求 0x3C - 0x90。首先 0x3C = 0b0011 1100,0x90 = 0b1001 0000
(1)当为有符号数时,显然这两个数是某两个数的补码。(具体是哪两个数X Y, 需要自己计算)。运算结果也是补码,是X-Y的补码 [X-Y]补。机器只运算到这一步。[X-Y]补 就是运算结果,溢出进位等标志位也都是这个补码运算过程的结果,由硬件ALU运算。X-Y并不是机器的运算结果,由[X-Y]补求X-Y是人或者编译器完成的工作,对于编译器来说运算结果才是X-Y。补码的减法要转换成补码的加法。根据有符号数的减法公式,[x]补-[Y]补=[x]补+[-Y]补=[X-Y]补,[x]补=0011 1100,[Y]补=1001 0000,其中求[-Y]补是关键。[-Y]补= {-[Y]补} mod 2^8,即[-Y]补={-[Y]补} 的求补操作(即-[Y]补 的补码)(即 按位取反再加一,这是机器真正的过程)。所以,[-Y]补=0111 0000,所以,[X-Y]补 = 0b0011 1100 - 0b1001 0000 = 0b0011 1100 + 0b 0111 0000 = 0xAC

(2)补码最大好处就是不管是有符号数还是无符号数都可以用同一套加减法。系统对有符号数和无符号数的加减法都采用一样的策略。无符号加减法不存在溢出问题,只是将进位或借位存储在CF中。机器不知道你进行的运算是否有符号,如果你进行的是有符号运算,你需要查看OF,否则不需要。所以,溢出不溢出,是由程序员判断的,机器不知道。不管是有符号数还是无符号数,系统都是按补码运算,至于是进位还是溢出不仅要看进位标志位,还要看溢出标志位。只不过在做无符号数运算时程序员不考虑溢出标志位,只考虑进位标志位而已。比如 0111+1101 ,你说它是无符号数7+13呢,还是有符号数 7-3 呢?
对系统而言这是一回事!所以,无符号数和有符号数的运算结果一定是一样的。

(3)注意这道题和《计算机组成原理》学补码加减运算时的题目的区别。例子:X=+0101,Y=-1010,求X-Y。题目给的X,Y 是原码, 所以已经默认是有符号数,也有判断是否溢出,所以默认的计算过程也是指机器运算过程。原码在机器中均是以补码保存和运算的,[x]补-[Y]补=[x]补+[-Y]补=[X-Y]补,只用到了[x]补+[-Y]补=[X-Y]补属于类型:已知X Y,所以先求[X]补, [-Y]补 ,便求得[X-Y]补。然后再求X-Y。也就是说,上一题已知的是[X]补 [Y]补,(机器的)运算结果是[X-Y]补。中间过程没必要求出X Y是什么数。本题已知的是X Y,先得出机器的运算结果[X-Y]补,再做编译器的工作由[X-Y]补求出X-Y。二者求[-Y]补的方法不一样:前者是由-[Y]补 求得的,后者是先求-Y,然后求[-Y]补。可以说,后面例子是编译器和系统共同工作的过程,前面例子只关系系统运算。

二.那么系统是怎么识别有符号数和无符号数的呢?
(1)CPU只会根据输入信号进行逻辑运算,在硬件级别是没有无符号有符号的概念,运算结束会根据运算前的信号和输出信号来设置一些标志位,是不是有符号由写程序的人决定,标志位要看你把操作数当有符号还是无符号来选择,就像内存中的数据,你可以按照需要来解析,原始数据在那里,你要按什么数据格式来解析在于自己的选择;
在汇编语言层面,声明变量的时候,没有 signed 和 unsigned 之分,汇编器统统将你输入的整数字面量当作有符号数处理成补码存入到计算机中,只有这一个标准!
(2)计算机对有符号整数的表示只采取一套编码方式,不存在正数用原码,负数用补码这用两套编码之说,大多数计算机内部的有符号整数都是用补码,就是说无论正负,这个计算机内部只用补码来编码!!!只不过正数和0的补码跟他原码在形式上相同,负数的补码在形式上与其绝对值的原码取反加一相同。
(3)有符号数和无符号数在计算机里表示都是一样的,即二进制的补码形式。是有符号还是无符号,是编译器来辨认的。

例如:
unsigned char uch, char ch;
在内存中有个数 0b11111111(补码)
把它赋给 uch,那么 uch 就是 255(正数的补码等于原码)
如果赋给 ch,那么 ch 就是 -1(负数的补码等于其除符号位外的原码取反+1)

说白了,内存中是补码值,代码中是原码值,代码中的原码到内存中的补码的双向转换是编译器根据原码补码规则自动处理的

  • 36
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
机器学习是一种人工智能(AI)的子领域,致力于研究如何利用据和算法让计算机系统具备学习能力,从而能够自动地完成特定任务或者改进自身性能。机器学习的核心思想是让计算机系统通过学习据中的模式和规律来实现目标,而不需要显式地编程。 机器学习应用非常广泛,包括但不限于以下领域: 图像识别和计算机视觉: 机器学习在图像识别、目标检测、人脸识别、图像分割等方面有着广泛的应用。例如,通过深度学习技术,可以训练神经网络来识别图像中的对象、人脸或者场景,用于智能监控、自动驾驶、医学影像分析等领域。 自然语言处理: 机器学习在自然语言处理领域有着重要的应用,包括文本分类、情感分析、机器翻译、语音识别等。例如,通过深度学习模型,可以训练神经网络来理解和生成自然语言,用于智能客服、智能助手、机器翻译等场景。 推荐系统: 推荐系统利用机器学习算法分析用户的行为和偏好,为用户推荐个性化的产品或服务。例如,电商网站可以利用机器学习算法分析用户的购买历史和浏览行为,向用户推荐感兴趣的商品。 预测和预测分析: 机器学习可以用于预测未来事件的发生概率或者趋势。例如,金融领域可以利用机器学习算法进行股票价格预测、信用评分、欺诈检测等。 医疗诊断和生物信息学: 机器学习在医疗诊断、药物研发、基因组学等领域有着重要的应用。例如,可以利用机器学习算法分析医学影像据进行疾病诊断,或者利用机器学习算法分析基因据进行疾病风险预测。 智能交通和物联网: 机器学习可以应用于智能交通系统、智能城市管理和物联网等领域。例如,可以利用机器学习算法分析交通据优化交通流量,或者利用机器学习算法分析传感器据监测设备状态。 以上仅是机器学习应用的一部分,随着机器学习技术的不断发展和应用场景的不断拓展,机器学习在各个领域都有着重要的应用价值,并且正在改变我们的生活和工作方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值