keil51下使用sprintf問(wèn)題
測(cè)試環(huán)境:keil c51 +STC89C52
說(shuō)明:
1.keil的不定參數(shù)只有15個(gè)字節(jié)
也就是說(shuō)sizeof(...) 加起來(lái)總共不能超過(guò)15字節(jié),否則會(huì)出錯(cuò)
2.當(dāng)不定參數(shù)中有常數(shù)時(shí),你也會(huì)得不到你想要的結(jié)果,字符串除外
例:
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);
則轉(zhuǎn)換完的結(jié)果是不正確的。
解決方式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
/*************************************************/
這個(gè)時(shí)候你會(huì)發(fā)現(xiàn),為什么keil c51會(huì)錯(cuò)了,因?yàn)樗鼪](méi)有內(nèi)存對(duì)齊
輸入常數(shù)12的時(shí)候,占一個(gè)字節(jié),他就給你分配一個(gè)字節(jié),輸入1234的時(shí)候占2個(gè)字節(jié)
他就給你分配兩個(gè)字節(jié)
而VC++6.0就不一樣了,你輸入的常數(shù)起碼都給分配4個(gè)字節(jié),所以在你取數(shù)據(jù)的時(shí)候,
取四個(gè)字節(jié)就不會(huì)錯(cuò)了,keil呢,該取幾個(gè)呢?不知道?所以數(shù)據(jù)會(huì)出錯(cuò)