Chinaunix首页 | 论坛 | 博客
  • 博客访问: 517306
  • 博文数量: 87
  • 博客积分: 1549
  • 博客等级: 上尉
  • 技术积分: 969
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-14 16:56
文章分类
文章存档

2013年(10)

2012年(28)

2011年(49)

分类: 其他平台

2013-07-07 09:48:11

测试环境: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呢,该取几个呢?不知道?所以数据会出错

参考自:

阅读(8569) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~