微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机的加减法原理

单片机的加减法原理

时间:11-17 来源:互联网 点击:
这是计算机组成原理的问题。计算机怎么表示负数。最高位为0,表示正数,最高位为1表示负数,例如

0b 0000 0011 表示 +3

0b 1111 1111 表示 -1

所以,那么数值的取值范围就是这么来的,一个字节有8位,如果是无符号数,那么就能表示 0~255 一共 256个数,但是如果是有符号数,也就是说这8位里面还需要表示一个符号,而且负号在最高位,那么数值只能是 bit0 ~ bit 7 表示,也就是说 -128 ~ 127

计算机里面做的运算都是补码运算,有符号数还是无符号数,计算机是不管的,其实这个只是写给编译器看的,由编译器去识别。并且生成相对应的代码。

原码,反码,补码的变换

原码,本来的数据叫原码,反码是各位取反,补码有具体的运算规则

例如signed char 类型的数据 +3

原码 0b 0000 0011 最高位为0,表示正数。

反码 0b 1111 1100 很简单,各位取反。

补码运算规则

1, 如果是正数,那么补码=原码

2, 如果是负数,那么补码=原码的反码+1

上面例子,+3的补码为 0b 0000 0011 ,和原码一样。

如果换成 -3 那么情况就是

0000 0011 à 1111 1100 + 1 à 1111 1101 这个就是 -3 的补码,计算机就是这样表示负数的。

于是今天研究了一下EMC单片机的加减运算

由于是用汇编写的,那么就压根没有所谓的有符号数和无符号数的区别。所以程序里面可以认为的认定,也就是我,我认为是他有符号,还是无符号。最麻烦的就是越界问题,数据过大溢出了。但是只需要记住一点,单片机电路是按照补码运算的,依稀的记忆中想起了当年数字电路课程里面出现的东西,不过记忆已经很模糊了。得复习一下。

最重要的是:计算机里面都是按照补码来运算的!!这是由数字逻辑电路决定的。

怎么和 C 进位联合起来。于是我想从几种情况分析。

1, 加法的情况,2+3 = 5 ,只要是智力没有问题的都不会算错吧 ……

单片机里面的情况,我们认为这个是有符号数,那么就是2个正数相加,

这里要注意的,“我当他是有符号数”是我人为加以假设,单片机可不吃这一套,反正,只要执行 mov 指令将数据送到单片机,那么单片机就认为这是补码,他可不管你有没有符号。

那么过程是这样:

大脑里面人为这两个是补码,那么根据补码的运算规则,正数的补码就是原码,得到

0000 0010

+ 0000 0011

--------------------------

0000 0101

进位 C=0 表示加法没有溢出。

这就是单片机的运算结果了。

单片机就是得到这个东西,这个是一个补码,因为单片机只认识补码,其他他不认识。那么然后我们将做小处理。

如果我们大脑将他看成是无符号数,那么这里表示的是 5 ,如果我们将他看成有符号数,那么这里表示的就是 +5 (因为最高位为0,原码和补码相同)

2, 如果两个数据比较大,相加会溢出,这怎么处理。0xff+0xff = ?

1111 1111

+ 1111 1111

--------------------------

1 1111 1110

进位 C=1 表示加法运算有进位。

那么其实这里表示的是 FF + FF =1FE ,C代表最高位,跟普通加法运算是一样的,因为计算机当成补码,他不管你什么数,他就按照补码运算。

3, 减法运算,差是正数: 3-2 = 1

前面加法,补码基本上没啥出场机会,但是减法就不同,减法就是补码发挥作用的时候。记以前数字电路的老师说过,数字电路只有加法器(全加器和半加器),是没有减法器的,所以计算机对待减法运算,实际上是用加法运算代替的。那么

3-2 可以转化为 3+(-2) 这个就是加法运算了。然后考虑两个数的补码。3为正数,所以补码为原码本身,-2 为负数,补码为反码后再加1,那么加过是

3 :0011

-2 :1110

那么 3-2 单片机运算的结果,实际上相当于 0011 + 1110 的结果,是

0000 0011

+ 1111 1110

--------------------------

1 0000 0001

C=1表示减法没有借位,结果为 00000001,这是一个补码,因此这个是正数,所以原码是他本身,也即是说结果为 1 ,没有错位,也就是说 被减数大于减数。

EMC单片机的代码是:

mov a,@3

mov 0x20,a

mov a,@2

sub 0x20,a

0x20存放最终结果,仿真运行结果,0x20数值为 1,C=1表示没有借位,Z=0表示运算结果非零。这个跟我们分析的完全吻合。

我们推广一下:

既然我们说了 3-2 最终会被计算机转化为补码加法,那么我将上面的EMC单片机的代码手工做成加法,那么期待得到的结果应该是一样的。

mov a,@3

mov 0x20,a

mov a,@0xfe

add 0x20,a

仿真运行结果,0x20数值为 1,C=1表示加法运算进位了,Z=0表示运算结果非零。这个跟上面的减法运算结果是一模一样的。这就是我们期待的结果,证明了单片机里面是补码的运算。

4, 减法运算,差

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top