① 单片机如何识别选择0、正数、负数
指令jz 或者jnz是判断0的指令,正负可以判断acc.7这一位。
PNZ:
MOV 20H,#0
MOV 30H,#0
MOV 40H,#0
MOV R0,#60H
LOOP:
MOV A,@R0
JNZ LP1
INC 20H
SJMP LP3
LP1:
JB ACC.7,LP2
INC 30H
SJMP LP3
LP2:
INC 40H
LP3:
INC R0
CJNE R0,#65H,LOOP
RET
② 单片机,进制转换问题
十六进制459C4000转成二进制是0100 0101 1001 1100 0100 0000 0000 0000最高位为符号位,0表示整数,1表示负数,因此这个是一个正数。然后往后数8个位,这8个位叫阶码,就是1 1011 110=十进制的139。139-127(这个127是固定的)=12。将阶码换成1.,然后就是1.001 1100 0100 0000 0000 0000。根据刚才的到的12,就是小数点右移12位,就是1001 1100 0100 0.000 0000 0000。小数点前面是整数部分,1001 1100 0100 0转十进制就是5000,然后小数部分为000 0000 0000转成十进制就是0。因此最终结果是5000了。
十六进制4616000转成二进制是0100 0110 0001 0110 0000 0000 0000 0000最高位为符号位,0表示整数,1表示负数,因此这个也是一个正数。然后往后数8个位,这8个位叫阶码,就是100 0110 0=十进制的140。140-127=13。将阶码换成1.,然后就是1.001 0110 0000 0000 0000 0000。根据刚才的到的13,就是小数点右移13位,就是1001 0110 0000 00.00 0000 0000。小数点前面是整数部分,1001 0110 0000 00转十进制就是9600,然后小数部分为00 0000 0000转成十进制就是0。因此最终结果是9600了。
这个就是计算器中浮点数的存储、转换的方式。
望采纳。。。。。。
③ 单片机中对最高有效位进行符号扩展是什么意思
最高有效位,比如你定义的signed
char
(8字节),那么的的最高位bit
0(这一位)
000
0000就是他的符号位,有符号位值的范围8位的就是-128到127,最高位为0是表示是正数,为1表示为负数。
(1)如果是整数
0xc0
二进制表示0b11000000。
(2)如果是负数
那么带符号扩展到16位
就是前面插入8个1
也就是0b
1111
1111
1100
0000。
(3)如果是正数,那么无符号扩展到16位
就是前面插入8个0
也就是0b
0000
0000
1100
0000。
④ 单片机中的cy和ov要怎样理解啊,能否举例子
CY(Carry): 用于表示加法进算中的进位和减法运算中的借位,加法运算中有进位或减法运算中有借位则CY位置1,否则为0
OV: 表示运算过程中是否发生了溢出,若运算结果超过了8位二进制数所能表示数据的范围即有符号数-128~+127,则标志位置1。
对无符号数的运算,判断只需CY即可,OV无作用。
对有符号数的运算,OV位是有用的。“OV位是C6位进位与C7位进位的异或”,说法对的(对51单片机而言),但不同的计算机说法不一
CY位是累加器的进位、借位标志。下文的叙述按16位机来举例说明,如果是8位机或其它字长,则可换一个例子,但道理相似。
对于无符号数的运算,CY位就可以表示其是否溢出。但如果是有符号数,则不能按CY标志来判断了。为此,设了另一个标志OV,其含义就是“假如是有符号数运算,是否出现了溢出”。
例如对于16位运算器,65534 + 3,(即二进制的1111111111111110 + 0000000000000011),
本该得65537,(即二进制的10000000000000001),但因为寄存器只有16位,最高位的那个1丢掉了(进入了CY标志)。结果寄存器中只剩下了1,(即二进制的0000000000000001)。
此时,我们可以说,16位的无符号数加法,65534+3溢出了,溢出后的答案成了1。
但是对于有符号整数,情况就不同了。有符号整数采用补码表示法。16位有符号整数不可能表示65534,此时如果机内二进制是1111111111111110,程序中认为它是-2,故:
机内的二进制的1111111111111110 + 0000000000000011,代表的是(-2) + 3。
请注意,此时的(-2)+3和上文的无符号数65534+3,在CPU的运算器硬件上完全相同,都是得到和为1,而CY标志也为1。
但是,有符号数(-2)+3=1并无溢出。故此时的CY标志不能代表它溢出了。
另外再举一例:
无符号数32763 + 8 = 32771,没有进位,CY标志为0。此时并不溢出。
但是,如果是有符号数32763 + 8,这就是溢出了,因为32773的二进制为1000000000000011,作为有符号数会被看成负数-32765。16位有符号数不可能表示32773的。
不管是有符号数还是无符号数,CPU的二进制运算器机器加、减操作是一样的,但其“溢出”的条件不同。
现在大多数的计算机中,如果是无符号数,都可以用CY标志来判断其是否溢出;而如果是有符号数,则需要用OV标志来判断其是否溢出。
至于OV标志在逻辑上又是根据什么产生的呢?则不同的计算机上有不同的实现方法,但效果都是一样。
这里介绍一种道理比较容易懂的方法:“双符号位法”。具体是:
作加、减法前,先将两个运算数都按照有符号数的规则扩充成17位。即:符号位是0的前面添一位0,符号位是1的前面添一位1。
然后按17位的机器加、减,得出17位的结果。
如果17位结果的高两位(即双符号位)不同,就置OV标志为1,否则,OV标志为零。
然后取其低16位作为最后结果。
⑤ 单片机中定义A=0和定义A=0x0000;,一样吗
就其实质,是没有什么区别的,都是给A赋0。只是写法不同而已。但是,A=0x0000,这种写法不规范,因为A是8位的,而写成A=0x0000,却是强调为16位了,可实际赋值还是0。那么一个0,前面和后面加多少个0,仍然还是0,怎么能不一样呢,虽然是16进制数,但也是0。如果是其它不是0的数,那结果肯定是不一样的。
⑥ 单片机中TH0和TLO可以取负数吗
可以用十进制的负数形式表示
举例说明:
定时器方式1时:
TH0
=
-10000/256;
TL0
=
-10000%256;
相当于
TH0
=(65536
-10000)/256;
TL0
=
(65536-10000)%256;
大家都知道计算机中的负数是以补码形式存储的,负数的补码为他的绝对值取反加1,|-10000|=二进制(0010011100010000),反码为1101100011101111,再加1为
补码
1101100011110000,对于有符号数来说最高位为符号位,对于计数器来说显然为无符号数,最高位为数据位,将补码转换为十进制正好
为55536。
这种表示方法往往更简洁,在单片机的编程中经常被应用,我在编程中就经常这样用,可以确认TH0和TLO用十进制的负数形式表示是没有问题的。