這個很基本的問題
不過最近又有了新的認定
如果不注意的話,真的會讓程式出現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,其實這個要非常的小心
沒有留言:
張貼留言