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

有符号数与无符号数的加减法声明 本博文源自 http www echojb com computer 2016 10 06 227097 html 在此感谢博主 一 有符号数的加减法 1 符号数与无符号数的人为规定性 一个数是有符号还是无符号数都是人为规定的

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


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

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

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

(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;
在内存中有个数 0b(补码)
把它赋给 uch,那么 uch 就是 255(正数的补码等于原码)
如果赋给 ch,那么 ch 就是 -1(负数的补码等于其除符号位外的原码取反+1)

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

今天的文章 有符号数与无符号数的加减法分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-12-14 23:27
下一篇 2024-12-14 23:21

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/85935.html