2009年10月10日 星期六

型態設定

這個很基本的問題


不過最近又有了新的認定


如果不注意的話,真的會讓程式出現bug


想debug也很困難


舉個例來說吧(以dsPIC 16bit  MCU為例)


long ans;


ans = 100 * 400;


ans = 100u * 400u;


ans = 100ul * 400ul ;


有誰看到這個題目,就可以很準確的看到這個答案呢?


答案在下方


 


 


 


 


 


 


 


 


 


 


 


 


 


ans = 100 * 400;


//ans=-25536;  數學上的答案應該是40000,為什麼會變成-25536,原因是因為假設沒有宣告數值的型態時,compiler會以幾bits 的MCU做compiler,以這個範例就會拿 int(16bit)來做compier,所以答案當然就是溢位嚕


ans = 100u * 400u;


//u是什麼,就是unsigned ,而當沒有明確的指出為何種型態時,也是會以compiler自行決定,而這個的例子就會宣告成 unsigned int,沒有錯,答案就會是標準的40000


ans = 100ul * 400ul ;


//ul是unsigned long,這個答案當然也不會有錯,是40000


 


這個問題很有趣,再舉個例子來說


long ans;


ans = 100 * 700;


ans = 100u * 700u;


ans = 100ul * 700ul ;


有誰看到這個題目,就可以很準確的看到這個答案呢?


答案在下方


 


 


 


 


 


 


 


 


 


 


 


 


 


ans = 100 * 700;


//ans=4464;  數學上的答案應該是70000,不過因為溢位的關系,所以答案就會有所落差


ans = 100u * 700u;


//ans=4464;  數學上的答案應該是70000,不過因為溢位的關系,所以答案就會有所落差


ans = 100ul * 700ul ;


//ul是unsigned long,這個答案當然也不會有錯,是70000


 


如果對compiler不熟的話,真的會是被整的,因為直覺看起來是不會錯的運算式子,因為不熟悉的關系才讓程式出了bug,其實這個要非常的小心


沒有留言:

張貼留言