keil51下使用sprintf问题
扫描二维码
随时随地手机看文章
测试环境:keil c51 +STC89C52
说明:
1.keil的不定参数只有15个字节
也就是说sizeof(...) 加起来总共不能超过15字节,否则会出错
2.当不定参数中有常数时,你也会得不到你想要的结果,字符串除外
例:
unsignedchar 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:
unsignedchar count_sec=2, count_min=3, count_hour=4;
改成:
unsigned int count_sec=2, count_min=3, count_hour=4;
相同的代码在VC6.0下却是正常,为何?
printf("%dn",12);
printf("%dn",1234);
/****************KEIL C51**************************/
143: printf("%dn",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("%dn",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("%dn",12);
00401628 push 0Ch
0040162A push offset string "%dn" (00426034)
0040162F call printf (00411040)
00401634 add esp,8
156: printf("%dn",1234);
00401637 push 4D2h
0040163C push offset string "%dn" (00426034)
00401641 call printf (00411040)
00401646 add esp,8
/*************************************************/
这个时候你会发现,为什么keil c51会错了,因为它没有内存对齐
输入常数12的时候,占一个字节,他就给你分配一个字节,输入1234的时候占2个字节
他就给你分配两个字节
而VC++6.0就不一样了,你输入的常数起码都给分配4个字节,所以在你取数据的时候,
取四个字节就不会错了,keil呢,该取几个呢?不知道?所以数据会出错