测试环境: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\n",12);
printf("%d\n",1234);
/****************KEIL C51**************************/
143: printf("%d\n",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\n",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\n",12);
00401628 push 0Ch
0040162A push offset string "%d\n" (00426034)
0040162F call printf (00411040)
00401634 add esp,8
156: printf("%d\n",1234);
00401637 push 4D2h
0040163C push offset string "%d\n" (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

keil51下使用sprintf问题的更多相关文章

  1. 在Linux下使用sprintf代替atoi实现整型转化为char*

    程序中需要用到将整型转化为char*类型,然后将两个char*类型的变量拼接.将整型转化为char*自然想到了itoa函数: 头文件:#include <stdio.h> char *it ...

  2. [c/c++] programming之路(4)、常量和变量

    一.打开多个程序(温习) #include<stdio.h> #include<stdlib.h> void main(){ ; ]; scanf("%d" ...

  3. 【Ruby】【基础】

    # [Ruby 块]=begin1 块由大量代码构成2 块中代码包含在{}内3 从与其相同名称的函数调用4 可以使用yield语句调用块=enddef test p '在test方法内' yield ...

  4. PHP微信公众号开发之自动回复

    先把源码类发出来 <?php /** 自己封装 微信 开发api */ header('Content-type: text/html; charset=utf-8');#设置头信息 class ...

  5. gcc和vs在c的一些区别

    1.switch中每个标签后面的命令在gcc中需要{}括起来以指明作用域. 2._itoa是非标准的c和c++扩展函数,在linux下可以使用sprintf(string,   "%d &q ...

  6. C++ operator关键字详解

    C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换. 类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转 ...

  7. 雷林鹏分享:Ruby 字符串(String)

    Ruby 字符串(String) Ruby 中的 String 对象存储并操作一个或多个字节的任意序列,通常表示那些代表人类语言的字符. 最简单的字符串是括在单引号(单引号字符)内.在引号标记内的文本 ...

  8. C语言新手写扫雷攻略2

    接下来是游戏的功能设计,要有扫雷的基本功能,左键点击雷区,右键红旗标记,并且可以统计雷数,可以重新开始,以下是游戏的功能初始 void Game(void) { while (1) { if (FLA ...

  9. C++程序结构---1

    C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...

随机推荐

  1. WP10的一点小问题

    兼容WP8.0/WP7.5不太完整!也许是测试版的问题.毕竟还没发布正式版! 具体如:WP8.0或WP7.5的启动器!就是选择图片的启动器!调用后对话框返回的结果都是Cancel本来应该是OK的.也就 ...

  2. 使用bootstrap-select控件 搜索栏键入关键字动态获取后台数据

    bootstrap-select开源地址:https://github.com/silviomoreto/bootstrap-select bootstrap-select使用示例:http://si ...

  3. vivado与modelsim的联合仿真

    转载: 一.在vivado中设置modelsim(即第三方仿真工具)的安装路径.在vivado菜单中选择“Tools”——>“Options...”,选择“General”选项卡,将滚动条拉倒最 ...

  4. ubuntu下su: Authentication failure的解决办法(su和su - root的区别)

    参考:ubuntu下su: Authentication failure的解决办法(su和su - root的区别)

  5. JavaScript流程控制及函数

    1 流程控制 1.1 条件语句 分支结构 单向分支 if (条件表达式) { code...} 双向分支 if (条件表达式){    } else {    } <!DOCTYPE html& ...

  6. 所有权链(Ownership Chain)

    所有权链(Ownership Chain)是特殊的权限评估方式,常见拥有所有权的数据库对象是:数据库对象,数据库角色(Role),和架构(Schema),在创建数据库角色,或架构时,SQL Serve ...

  7. 解决table td里面长串数字或字母不换行的问题

    在html中,经常要用到table标签,一般情况下,table下面的td元素里的东西都是汉字或者说是汉字.字母.数字的混合,在这种情况下,不设置table的宽度,也就是table宽度自适应的时候,浏览 ...

  8. GNU构建系统和Autotool

    原文:http://os.51cto.com/art/201609/518191.htm 经常使用Linux的开发人员或者运维人员,可能对configure->make->make ins ...

  9. Macaca上手体验

    在研究了一段时间Appium后,尝试对另一个框架做实验——Macaca,阿里的开源测试框架,该框架不只适合移动端,同样适用于web端,可谓是方便的很啊~ 同时支持js.java.python.封装好的 ...

  10. Python学习过程笔记整理(三)

    函数 -函数使用 -函数需要先定义,定义不会执行函数 -使用函数,俗称调用 -定义函数 -格式:def 函数名称(参数=默认值):,函数名称不能用大驼峰,参数可以没有 -调用函数 -格式:函数名(参数 ...