int 数据类型非常常用,在keil编译器中int 是16位存储空间,最高位是符号位,取值范围 -32768~32768。
在VC中int 32位存储空间,取值范围是 -2147483648~ 2147483648。所以您的程序如果使用int数据类型,在keil中与VC中运行结果可能不一样。也就是说会出错。解决的办法是在VC中使用short int 。short int是16位存储空间。
因为C51的寄存器是8位的,所以C51在计算int时比较麻烦的。如果是两个整型A、B数据相加,MCU的方法是先将A、B的低8位相加,再将进位与A、B高位相加。所以需要两次加法。如果是char数据加法运算,只需一次加法即可。所以能使用char数据时就使用char数据。这样计算机量能小一点。
乘法更是如此。我们看看以下代码怎么实现。
char x=10;
char y=23;
char z;
z=x*y;
C:0x000F 740A MOV A,#0x0A ;将0x0a(10)移入A寄存器中
C:0x0011 75F017 MOV B(0xF0),#0x17 ;将0x17(23)移入B寄存器中
C:0x0014 A4 MUL AB ;A寄存器值与B寄存器值相乘,结果存入A中
C:0x0015 F508 MOV 0x08,A ;将A寄存器的值移入8号地址
四条语句即可实现两个char数据相乘。
我门再看看以下代码如何实现
char x=10;
char y=23;
char z;
z=x*y;
C?IMUL:
C:0x0003 EF MOV A,R7 //将R7的值(X低8位)移入A寄存器
C:0x0004 8DF0 MOV B(0xF0),R5 //将R5的值(x低8位)移入b寄存器
C:0x0006 A4 MUL AB //A寄存器值与B寄存器值相乘,结果存入A寄存器
C:0x0007 A8F0 MOV R0,B(0xF0) //B寄存器的值移入R0中
C:0x0009 CF XCH A,R7 //R7的值与A交换
C:0x000A 8CF0 MOV B(0xF0),R4 // 将R4的值(y高8位)移入B寄存器
C:0x000C A4 MUL AB //A寄存器值与B寄存器值相乘,结果存入A寄存器
C:0x000D 28 ADD A,R0 //R0的值与A寄存器值相加
C:0x000E CE XCH A,R6 //R6的值与A交换
C:0x000F 8DF0 MOV B(0xF0),R5 //将R5的值(y低8位)移入B寄存器
C:0x0011 A4 MUL AB //A寄存器值与B寄存器值相乘,结果存入A寄存器
C:0x0012 2E ADD A,R6 //R6的值与A寄存器值相加
C:0x0013 FE MOV R6,A //将A寄存器移入R6中
C:0x0014 22 RET
int x=10;
C:0x0015 7F0A MOV R7,#0x0A ;将0x0a(X低8位,10)移入R7中,
C:0x0017 7E00 MOV R6,#0x00 ; ;将0x00(X高8位,0)移入R6中
7: int y=10;
8:
9: int z;
10:
C:0x0019 7D0A MOV R5,#0x0F ;将0x0f(y低8位,10)移入R5中
C:0x001B 7C00 MOV R4,#0x00 ; ;将0x00(y高8位,0)移入R4中
11: z= x*y;
C:0x001D 120003 LCALL C?IMUL(C:0003) ;调用MUL
C:0x0020 8E08 MOV 0x08,R6 //R6移入8号地址
C:0x0022 8F09 MOV 0x09,R7 //R7的值移入9号地址
两种相同结果,但是是截然不同的过程。所以为了节省程序空间、提高程序运行效率,应该选用合适的数据类型。
unsigned int是无法号数据,所以可以取值范围是:0~65536.
long int 是32位数据,所以可以取值范围是 -2147483648~+2147483648。相当大了。 在keil没有long long int 64位存储空间。大家要是有兴趣写代码可以试试keil是怎样实现的,相信会有收获!
文章评论(0条评论)
登录后参与讨论