• keil51下使用sprintf问题


    测试环境:keil c51 + STC89C52
    说明:

    1.keil的不定参数只有15个字节
    也就是说sizeof(...) 加起来总共不能超过15字节,否则会出错

    2.当不定参数中有常数时,你也会得不到你想要的结果,字符串除外

    例:
     unsigned char count_sec=2, count_min=3, count_hour=4;
     xdata char buf[12] = "";
     sprintf(buf, "%2d:%2d:%2d", count_hour, count_min, count_sec);
    则转换完的结果是不正确的。
    解决方式1:
    unsigned char count_sec=2, count_min=3, count_hour=4;
    改成:
    unsigned int count_sec=2, count_min=3, count_hour=4;
    相同的代码在VC6.0下却是正常,为何?
    printf("%d ",12);
    printf("%d ",1234);
    /****************KEIL C51**************************/
    143: printf("%d ",12); 
    C:0x098D 7BFF MOV R3,#0xFF
    C:0x098F 7A0A MOV R2,#0x0A
    C:0x0991 7902 MOV R1,#0x02
    C:0x0993 75390C MOV 0x39,#0x0C
    C:0x0996 12057D LCALL PRINTF(C:057D)
    144: printf("%d ",1234); 
    C:0x0999 7BFF MOV R3,#0xFF
    C:0x099B 7A0A MOV R2,#0x0A
    C:0x099D 7902 MOV R1,#0x02
    C:0x099F 753904 MOV 0x39,#0x04
    C:0x09A2 753AD2 MOV 0x3A,#0xD2
    C:0x09A5 12057D LCALL PRINTF(C:057D)

    /******************VC++6.0***************************/
    155: printf("%d ",12);
    00401628 push 0Ch
    0040162A push offset string "%d " (00426034)
    0040162F call printf (00411040)
    00401634 add esp,8
    156: printf("%d ",1234);
    00401637 push 4D2h
    0040163C push offset string "%d " (00426034)
    00401641 call printf (00411040)
    00401646 add esp,8
    /*************************************************/

    这个时候你会发现,为什么keil c51会错了,因为它没有内存对齐
    输入常数12的时候,占一个字节,他就给你分配一个字节,输入1234的时候占2个字节
    他就给你分配两个字节
    而VC++6.0就不一样了,你输入的常数起码都给分配4个字节,所以在你取数据的时候,
    取四个字节就不会错了,keil呢,该取几个呢?不知道?所以数据会出错

    参考自:http://hi.baidu.com/bnsd_/item/91d926c13a17f44ea8ba9467

  • 相关阅读:
    SharePoint 2013 文档库中PPT转换PDF
    Linux线程-互斥锁pthread_mutex_t
    利用Python,四步掌握机器学习
    linux 文件夹权限及umask
    Android.mk入门(一)
    《Linux性能及调优指南》----1.1 Linux进程管理
    从进程到线程
    从程序到进程
    Android源码解析系列
    嵌入式工程师必读100本专业书籍
  • 原文地址:https://www.cnblogs.com/shirishiqi/p/5556469.html
Copyright © 2020-2023  润新知