- 論壇徽章:
- 0
|
這么一段小程序:
#include
#include
int main(void)
{
unsigned long long a = 1;
int b =10;
printf("a= %d, b= %d\n",a,b);
}
在Solaris上編譯,運(yùn)行后會得到下面的結(jié)果:
a= 1, b= 0
深入調(diào)查后,發(fā)現(xiàn)是由于64位printf的format錯(cuò)誤引起。
對于每種類型,都應(yīng)該嚴(yán)格按照其類型制定打印format,上面的64位數(shù)據(jù)打印應(yīng)該使用%llu選項(xiàng)。似乎printf在解析參數(shù)的時(shí)候,把format串之后的所有變量當(dāng)成了一個(gè)buffer處理。這是C庫對不定長參數(shù)的處理方法,上面的結(jié)果應(yīng)該是平臺無關(guān)的。
好在這里只是輸出,如果使用sprintf之類的函數(shù),得到的結(jié)果更無法預(yù)料了。
本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u/24393/showart_325972.html |
|