首页 > 编程知识 正文

c语言加减法代码,单片机应用技术c语言版答案

时间:2023-05-03 14:00:14 阅读:59038 作者:37

原标题:单片机加减法原理

这是计算机组成原理的问题。 计算机如何表示负数? 最高位为0表示正数,最高位为1表示负数。 例如

0b 0000 0011表示3

0b 1111 1111表示-1

因此,在中,数值的可取范围是这样的。 1个字节有8位,如果是无符号数,则0到255之间总共可以表示256个个数。 但是,有符号的数量,也就是说,如果在这8位中还需要表示一个符号,并且负号位于最高位,则数值只能表示bit 0到bit 7。 即,-128 ~ 127

计算机中进行的所有运算都是补数运算,有符号还是无符号与计算机无关。 其实这只是写在编译器上的,编译器会识别的。 生成对应的代码。

转换原始代码、反码和完成代码

原码,原始数据叫原码,反码各位取反,补码有具体。

例如信号通道类型数据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,智能没有问题的话就没错了吧……

单片机中的情况,我们认为这是有符号的数。 然后,两个正数相加。

这里需要注意的是,“我以为他是有符号的数”是我人为假设的,单片机不吃这一套,反正,执行mov指令把数据发送到单片机

该过程如下

如果大脑中人为这两个是补数,则根据补数的运算规则,正数的补数是原码,可以得到

0000 0010

0000 0011

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

0000 0101

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

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

单片机就是要得到这个。 这是补充代码。 因为单片机只识别互补代码,其他他都不识别。 然后我们再做小处理。

如果我们的大脑认为他是无符号的数,这里表示5;如果我们认为他是有符号的数,这里表示5。 (最高位为0,因此原始代码和补码相同。 )

2,2个数据较大时,相加后会溢出。 这个怎么处理?0xff0xff=?

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

mov0x20,a

mov a,@2

sub0x20,a

020保存最终结果,模拟运行结果,020的数值为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, 减法运算,差是负数,也就是说不够减,例如 2-3 = -1

这个运算在单片机里面究竟是怎么进行的呢?其实也很简单,记住我们的信条:“单片机里面都是补码运算”那么很自然的化成 2 + (-3),求出 2 和 -3的补码并进行运算

0000 0010

+ 1111 1101

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

0 1111 1111

进位位C = 0表示减法运算发生错位,结果是 0b11111111,这就是最终结果了。

但是这个值我们要看的懂,必须变化为原码,说过了,这是一个补码,最高位为1表示这是一个负数,所以求原码的办法,也是将补码取反再加一,也就是

0b11111111 à 0b00000000+1 à 0b00000001

这个就是我们最终的结果,是一个负数,绝对值为1,也就是说结果为 -1

这跟我们期待的结果是一模一样的。EMC单片机仿真代码以及结果:

mov a,@2

mov 0x20,a

mov a,@3

sub 0x20,a

寄存器0x20的值为 0xff,进位C=0表示减法发生了错位,Z=0表示结果非零。

这完全和我们分析的吻合。再强调,单片机里面出现的都是补码,所以这结果的 0xff 也是补码,想看懂得转化为原码。上面已经说了转化办法。

另外,我们需要分开来看,我们上面是说将这个数字看成是“有符号数”,2-3=-1这个是我们要的结果,但是,如果我们把这个数看成是“无符号数”那又该怎么办呢?

办法就是,借位,跟我们手工减法一样,不够减就向高位借位。

2-3 = 0010 – 0011 这是不够减的,那么 2应该向高位借一,变成 10010 – 0011 = 1111,这里扮演高位的其实就是进位C,也就是说C=0时是发生错位的,为什么?因为这个C=1被被减数借去用了,结果为 0xff ,这个时候 0xff 就是我们想要的结果,不需要变化,因为我们不是看成有符号数。

5, 两个数比较大小 CMP A , B

两个数比较大小,记得以前微机原理的老师给我们说了,本质就是做减法运算,然后判断标志位。EMC单片机没有CMP比较指令,但是我们通过减法指令可以达到目的,从本质上说,那是一致的。

因为这些逻辑判断是固定的,而且比较繁琐,容易出错,所以是建议做成宏调用,这样跟其他单片机上面的 CMP指令是一样使用的,比较方便。

(1)A>B

A-B >0 我们一定要强调顺序,也就是说,谁减去谁 的问题,不能搞乱。A-B操作之后PSW的标志位状态

C=1表示没有借位,Z=0 表示结果不为0

(2)A=B

C=1 表示没有借位,Z=1表示结果为0

(3)A

C=0 表示借位,Z=0表示结果不为0

那么很简单推导出另外两个常用的关系:

(4)A >= B

C=1 或者 Z=1,通过Z能判断是否相等。

(5)A <= B

明显这里是或关系C =0 或者 Z=1 都满足条件判断。

(6)A != B

很简单,只需要 Z=1 就能满足要求

根据这5个关系,写成5个常用的宏,将给程序编写带来非常大的方便。具体实现代码在EMCLIB库里面/arch/generic.dt里面。

责任编辑:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。