有符号数的加减法 和无符号数的加减法,和,系统是如何识别有符号数和无符号数的

一.有符号数的加减法

1、符号数与无符号数的人为规定性:

一个数,是有符号数还是无符号数都是人为规定的。进行二进制运算时用无符号数或是补码运算时,结果都是正确的。

10000100+00001110

若规定为无符号数,即 132+146=146D 。

若规定为符号数,则为-124+14=-110,而[-110]补=10010010。解释:10000100是 -124的补码,0001110是14的补码,在机器中运算后得出的结果是[-110]的补码。机器中的有符号数的运算一般就是补码的运算。

2、补码加减法运算

计算机中,当确定为符号数运算时,符号数一律用补码表示,运算时符号位和数字位一起参加运算。同样,运算结果也用补码表示。

1)两符号数相加公式:

[X+Y]补=[X]补+[Y]补

2)两符号数相减公式:

[X-Y]补=[X]补+[-Y]补

3.例子:

求3CH-90H。

首先3CH=0011 1100,90H=1001 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]补=0011 1100-1001 0000=0011 1100+0111 0000=ACH

(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 和 unsignde 之分,汇编器统统将你输入的整数字面量当作有符号数处理成补码存入到计算机中,只有这一个标准!

(2)

计算机对有符号整数的表示只 采取一套编码方式,不存在正数用原码,负数用补码这用两套编码之说,大多数计算机内部的有符号整数都是用补码,就是说无论正负,这个计算机内部只用补码来 编码!!!只不过正数和0的补码跟他原码在形式上相同,负数的补码在形式上与其绝对值的原码取反加一相同。

(3)

有符号数和无符号数在计算机里表示都是一样的,二进制的补码形式。
是有符号还是无符号,是编译器来辨认的。
例如:
unsigned char uch, char ch;
在内存中有个数0b11111111.
把它赋给uch,那么uch就是127
如果赋给ch,那么ch就是-1

时间: 2024-10-14 05:08:01

有符号数的加减法 和无符号数的加减法,和,系统是如何识别有符号数和无符号数的的相关文章

8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下

8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下 # 8.10 shell 特殊符_cut命令 --- - * 任意个任意字符 - ?任意一个字符 -  井号#注释字符  写命令的时候前面加一个#,那么这条命令就不生效,包括shell脚本里面也是,前面加个#表示这一行不生效,可以加一些注释说明的文字 ``` <[email protected] ~># #ls a.txt <[email

五周第五次课(1月12日) 8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号

五周第五次课(1月12日)8.10 shell特殊符号cut命令8.11 sort_wc_uniq命令8.12 tee_tr_split命令8.13 shell特殊符号相关测验题目:http://ask.apelearn.com/question/5437 扩展1. source exec 区别 http://alsww.blog.51cto.com/2001924/1113112 2. Linux特殊符号大全http://ask.apelearn.com/question/7720 3. so

MacBook Pro/Air 下使用 linux ubuntu 系统 波浪号“~”变成其他 符号 的完美解决办法

打开终端,输入: sudo su - echo 0 > /sys/module/hid_apple/parameters/iso_layout sudo su -需要root权限,所以使用前请注意已下载root,没有root的请输入以下代码: #没有root的请输入以下代码下载root sudo apt-get install root 这时你会发现“~”能打出来了,但是重启系统又会恢复原样,所以我们要在下面 rc.local 文件中添加一行代码: 路径:/etc/rc.local sudo v

修改系统及nginx程序最大访问数,解决高并发问题

修改最大访问数.先更改内核参数查看: ulimit -a查看此行open files (-n) 140000进入系统配置文件进行修改:[[email protected] ~]#vi /etc/systemd/system.conf#DefaultLimitNOFILE=DefaultLimitNOFILE=140000#DefaultLimitAS=#DefaultLimitNPROC=DefaultLimitNPROC=140000 重启生效 但是查看程序发现Max open files依然

进程间通信之-信号signal--linux内核剖析(九)

信号及信号来源 什么是信号 信号是UNIX和Linux系统响应某些条件而产生的一个事件.接收到该信号的进程会对应地採取一些行动.通常信号是由一个错误产生的. 但它们还能够作为进程间通信或修改行为的一种方式,明白地由一个进程发送给还有一个进程.一个信号的产生叫生成.接收到一个信号叫捕获. 信号本质 信号是在软件层次上对中断机制的一种模拟,在原理上.一个进程收到一个信号与处理器收到一个中断请求能够说是一样的. 信号是异步的.一个进程不必通过不论什么操作来等待信号的到达,其实,进程也不知道信号究竟什么

java 20 - 5 字节输出流写出数据的一些方法

首先回顾下 字节输出流操作步骤:  A:创建字节输出流对象  B:调用write()方法  C:释放资源 创建字节流输出对象 FileOutputStream fos = new FileOutputStream("fos.txt"); 先介绍字节输出流的write方法: public void write(int b):写一个字节 public void write(byte[] b):写一个字节数组 public void write(byte[] b,int off,int le

Linux程序设计学习笔记——异步信号处理机制

转载请注明出处: http://blog.csdn.net/suool/article/details/38453333 Linux常见信号与处理 基本概念 Linux的信号是一种进程间异步的通信机制,在实现上一种软中断.信号能够导致一个正在执行的进程被异步打断,转而去处理一个突发事件.异步事件不可预知,仅仅能通过一些特定方式预防.或者说,当该异步事件发生时依据原来的设定完毕对应的操作. 信号本质 信号是在软件层次上对中断机制的一种模拟.在原理上,一个进程收到一个信号与处理器收到一个中断请求能够

关于shell脚本时遇value too great for base (error token is &quot;08&quot;)

今天在书写一个定时cp脚本时遇到了一个问题,value too great for base (error token is "08") 在网上查看到原来是以0开头的数字 系统会默认识别为八进制数,所以我的 $datem-1这样的获取上个月的月份是回报:value too great for base (error token is "08")这个错误的,解决办法就是 将$datem格式或者声明称十进制,`10#$datem`-1  这样就可以了.  也就是将要转换

验证码识别与生成类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等

以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数字+小写.数字+大写.数字+大小写等情况. 四位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数字+小写.数字+大写.数字+大小写等情况. 简单验证码识别:验证码类型 : 数字+字母, 纯英文, 纯数字,计算题 英数_验证码识别:纯数字,纯英文,数字+英文 中英数_验证码识别:英文.数