原创 C语言与单片机-7-数据类型3

2015-10-26 21:15 2743 8 8 分类: MCU/ 嵌入式 文集: C语言

    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条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条