设计与开发

单片机中 = 单片机中数的表示及运算

小编 2024-11-24 设计与开发 23 0

单片机中数的表示及运算

单片机中的数是以二进制表示的,分为有符号数和无符号数两种。

有符号数的表示方法

有符号数是指有“ + (正)”、“ − (负)”符号的数。由于单片机采用二进制数,所以只有“1 ”和“0”两种数字,其中用“ 0 ”表示“ + ”,用“ 1 ”表示“ − ” 。单片机中的数据一般只有8位,一般规定最高位为符号位,因为要用1位表示数的符号,所以只有7位用来表示数值,可以表示− 127~+128。

有符号数的表示方法有 3 种:原码、反码和补码。同一有符号数,用 3 种表示方法得到的数是不同的。下面用3种方法来表示两个有符号数+1011101和− 1011101。

(1)原码

用“1”表示“−”,用“0”表示“+”,其他各数保持不变,采用这种方法表示出来的数称为原码。

+1011101用原码表示是01011101,可写成[01011101] 原。

− 1011101用原码表示是11011101,可写成[11011101] 原。

(2)反码

反码是在原码的基础上求得的。对于正的有符号数,其反码与原码相同;对于负的有符号数,其反码除符号位与原码相同外,其他各位数由原码各位数取反得到。

+1011101用反码表示是01011101,可写成[01011101] 反。

− 1011101用反码表示是10100010,可写成[10100010] 反。

(3)补码

补码是在反码的基础上求得的。对于正的有符号数,其补码与反码、原码相同;对于负的有符号数,其补码除符号位与反码一致外,其他数由反码加1得到。

+1011101用补码表示是01011101,可写成[01011101] 补。

− 1011101用补码表示是10100011,可写成[10100011] 补。

有符号数的运算

用原码表示有符号数简单、直观,但在单片机中,如果采用原码进行减法运算,需要很复杂的硬件电路;如果用补码,可以将减法运算变为加法运算,从而省去减法器而简化硬件电路。

例如:用二进制减法运算和补码加法运算分别计算35 − 21。

① 二进制减法运算:35 − 21=00100011 − 00010101=00001110

② 用补码加法运算。

先将算式转换成补码形式,35 − 21=[+35]+[ − 21]= [00100011] 原 +[10010101] 原 =[00100011] 反+ [11101010] 反 =[00100011] 补 +[11101011] 补。

再对补码进行二进制加法运算:

从上面的运算过程可以看出,补码的符号也参与运算,在8位单片机中,由于数据长度只能有8位,上式结果有9位,第9位会自然丢失,补码加法的运算结果与二进制减法的运算结果是一样的,都是00001110=14。

由此可见,用补码的形式进行运算,可以将减法运算转换为加法运算,运算结果仍是正确的,所以单片机普遍采用补码的形式表示有符号数。

无符号数的表示方法

无符号数因为不用符号位, 8 位全部用来表示数据,所以这种方法可以表示的数据范围是 0 ~ 255 。 8位二进制数的不同表示方式的换算关系见表1-6。

表1-6 8位二进制数的不同表示方式的换算关系

表1-6

续表

表1-6

从表1-6中可以看出,对于同一个二进制数,当采用不同的表示方式时,得到的数值是不同的,特别是大于10000000的有符号数。若想确切知道单片机中的二进制数所对应的十进制数是多少,先要了解该二进制数是有符号数还是无符号数,再换算出该二进制数对应的十进制数。

自学单片机第十四篇下:运算方法

​关注一下,更多精彩等着你!

在程序的运行中,我们需要经常的操作端口状态,或者需要进行端口数据的转换和计算,还有的我们程序内部也会涉及大量的计算,在单片机中,有一套与我们数学计算中不太一样的计算方法,之前我们就C语音做过简单的介绍,今天,就编程中的运算方法,我们进行简单的复习和运用练习。

1,《+》加

这个是加号,跟数学的+号,含义一样,运用方法也是一样的。都是两个加数相加得出一个结果,这个结果就是两个数的和。

例如:1+1=2。

2,《++》连加

这个是程序中比较常见的一种用法,含义是在原有数据的基础上加上1,属于累积加法的一种简写。就等同于x=x+1,简化书写,大家都明白其含义也就可以了。

例如:a=a+1,b++。

3,《-》减

这个就是同+一样的,一个数学运算,就是减法。

例如:2-1=1。

4,《--》连减

这个是连续减1,跟连续加1的使用方法一样。也是相当于x=x-1。属于简写。

例如:a=a-1,b--。

5,《*》乘法

同样是数学基本运算,运算法则与数学一致。

例如:4*5=20,c=a*4。

6,《/》整除

这个是除法,用法与数学一致,但有一点不同,这个运算符号,仅会对除得的结果整数部分进行保存,余数就会舍弃。相当于只取整数部分,小数部分就丢了。

例如:3/2=1.5(这是数学方法),3/2=1(这是程序结果)

因此在使用中应牢记,避免出现错误。如果我们需要用到小数部分,需要进行相应的处理才可以。不然直接得出的结果只有整数。而小数部分要靠下边的取余来解决。

7,《%》取余

由于除法在程序中无法获取小数部分,所以,我们增加了取余的算法,就是相当于把没除尽的数单独取出来。

例如:15%4=3。

15除以4,得到整数是3,因为3乘4是12,余下15减12等于3。所以余数就是3。

再比如:3%2=1,20%15=5。

如果我用《/》法得到了整数,那如何得到小数部分并显示呢?余数只是余下了多少,并不是小数。一般的,可以这么处理。

例如:

6/5=1是整数部分,保存为一个变量A,

6%5=1是余数部分,保存为一个变量B,

然后将B=B*10,扩大十倍,余数1就变成了10。

C=B/5,C中的数就是2=10/5,第一位小数就取出来了。

B=B%5。这样,B=10%5=0,就意味着除尽了。在显示时,整数放一块,小数放一块,中间用小数点隔开就可以了。

这就完成了小数的计算。

当然也有其它方法,这就是为了说明取余的用法。

8,《&》与

逻辑算法是处理数据位用的,在高中学的,与门或门非门等。与的意思是都要有,1与1等于1,1与0等于0,0与0等于0。

都为真才输出真,其一为假就是假。

例如:1010&1101=1000。

一般的可以用它来使某一位清零,比如原来有一个数1101,我想把它的第三位清零。就可以操作:

1101&1011=1001。

这样第三位清了,其它保持不变。假如此时第二位由0变成了1,在操作时,

1111&1011=1011。

第二位会随之变动,因为1与1为1,1与0为0,所以只有我们提供0去操作,才会出现改变。用1就不会改变。在后期端口操作时会用到。

9,《|》或

同样是基本逻辑运算,有其一为1,就为1,有其一为真,即是真。

1或1等于1,1或0等于0,0或0等于0。也就是说,任何结果只要和1或,就会输出1。

例如:1101|1010=1111。

一般的,可以用它来对某一位进行置1,用法与&基本相似。例如1000,我们将其第一位置1,就可以写成:

1000|0001=1001

如果此时第三位发生了变化,从0变成了1,写成1100,这时我们对第一位置1,写成:

1100|0001=1101

可以看出,对其他位没有影响,这就相当于我们可以对其中一位进行操作,而不用去定义单独的一位了。减少了程序的结构。

10,《!》非

在逻辑中,这是不的意思,例如与=号放一起!=,就是不等于的意思。

例如:a!=b。

就是说a的值与b不相等。用法简单。

11,《~》取反

也可以说是按位取反,就是把一个数据的每一位,0变成1,1变成0。

例如:~1001=0110

这个在我们使用中,可以用来对端口进行关闭或打开操作,或者对数据进行变换,传输中加密。

12,《<<》左移位

这是将一个数据组,最左边的一位移除,然后右边空出的一位用0补齐。

例如:1001<<1=0010,1010<<1=0100

当然也是可以一次移动多位,1010<<2=1000.

13,《>>》右移位

这个是跟左移位一样的,就是把最低位移除,最高位用0补齐。

14,《【】》数组

常用的函数方式,有时我们会使用一些数据组,如果单独去定义,就需要很多的变量名,于是我们就会采用数组的方式,把数据保存在数组中,使用时取出即可。也有一些是固定的数据,我们存储在数组中,使用时直接调用即可。

例如:led【5】={1,2,5,6,8}。

意思是一个叫led的数组中,有五个元素,分别是1,2,5,6,8.如果我们要取出某一个元素,就可以直接操作,a=led【2】,这里的2,相当于取出的是第三个元素5,【】括号中的数是元素的脚码,是从0开始的,【0】对应的是元素1,【1】对应的是元素2,【2】对应的是元素5,【3】对应的是元素6,【4】对应的是元素8。

当然还有很多的运算方法,我们先介绍这几个,接下来的程序中会使用到,如果有什么疑问可以返回这篇文章查看一下,当然,要是有更好的建议或想法,欢迎留言或私信给我。

更多多内容,欢迎关注百家号:小亮谈电气。微信公众号:电气学苑。

相关问答

单片机 填空求助1.MCS-51系列单片机为()位单片机.2.8051单片...

[最佳回答]1.MCS-51系列单片机为(8)位单片机.2.8051单片机有两种复位方式,既上电复位和手动复位.复位后SP=(07H),PC=(0000H),PSW=(00H),P0=(F...

单片机中 A = 4EH,B=5DH,MULAB怎么计算的结果是AB=1C56H?怎么来...

[最佳回答]列算式就可以知道怎么得到的了:01001110;A=4EH,01011101;B=5DH,------------------------;x;MULAB01001110000000000100...

单片机 C语言中比如led = ~led,波浪线什么意思? - 芝芝雨 的回...

言位操作的一种,其操作符为~。该操作为单目操作,即只有一个操作数。~与其后的数值或变量相结合,执行取反计算。取反是按照二进制位进行计...该操作...

单片机 循环移位指令中A = 7AH?

首先,RLC表示A带进位标志(CY)循环左移一次,相当于乘以2;进位标志CY=1,则A=7AH=123D(十进制的123)的带进位标志用二进制表示为101111010,将其整体...首先,R....

单片机 ,已知(A) = 36H,(B)=59H,执行如下两条指令,ADDA,B;DAA后...

[最佳回答](ACC)=95H

关于 单片机中 addc的运算有两个数A = 79HR1=A2HCY=1ADDCA,R1后A...

[最佳回答]ADDCA,R1之后,A=0x1CCY=1;//由于高4位产生进行,所以CY置1AC=0;OV=0;P=1;//奇偶效验位,由于A=0X1C为奇数,所以由硬件置1由于ADDC指令的作用是:将....

单片机中 调整指令:DA若A = 35H,执行下列程序段后,累加器A的...

[最佳回答]答案是A=62HDAA是BCD加法后的调整两个BCD码相加35+27=62ADDA,#27后A=5BHDAA;进行调整就成了62H一定是两个BCD码相加,DAA要紧跟在AD...

TR0等于1什么意思?

TR0是51单片机定时器T0的定时器启动位。TR0=1表示开启定时器(在EA打开的前提下)。EA是51单片机的总中断开关,所有中断都必须先使EA=1。51单片机中的定...

单片机 设(70H) = 30H什么意思?括号有什么含义?

括号里的表示内存地址号,加上括号表示按地址号寻址以指向该内存括号里的表示内存地址号,加上括号表示按地址号寻址以指向该内存

求各位大哥举例说明 单片机中 的OV的用法!单片机书上说用0V = 1表示错误,怎么理解?

OV主要用于有符号数的运算,平时很少用。对有符号数来说,8位二进制数的最高位D7为符号位,当两个有符号数相加时,数的最高位这时应该是D6,也就是说按道理来讲...

猜你喜欢