中午吃完飯照例去雲風大神的blog上去逛一圈,果真有新發現,如題:spa
1 char buff[3]; 2 char data; 3 sprintf(buff, "%02x", data);
咋一看,data最大等於0xff應該不會錯,能夠若是編譯器默認char爲signed char,並且data = -1,以十六進制看應該爲0xff,這麼看也沒有錯。code
關鍵在於變參,在C語言的變參中,小於int長度的數據壓棧時一概擴展爲int型, 那麼問題來了,符號型數據在進行類型擴展時是會擴展符號的,這麼看其實blog
data = -1; sprintf(buff, "%02x", data); //(int)-1的16進制等效於0xffffffff,所以等效於下面這句話 sprintf(buff, "%02x", 0xffffffff);
如此看來,溢出了,這種問題極易出現,並且不易發現。編譯器