在嵌入式程式設計過程中,最長接觸到的就是無符號數,但也不可避免的會遇到有符號數,當有符號數與無符號數相遇時,總會發生一些「奇妙的玄學」。而這「玄學」稍有不慎就會造成無法彌補的錯誤。
來看下面一段程式碼
#include <stdio.h>
void main(void)
{
unsigned int a = 5;
int b = -5;
if (a > b)
{
printf("a大於b\r\n");
}
else
{
printf("a不大於b\r\n");
}
}
這段程式碼輸出的結果會是什麼呢???
有點意思,5居然不大於-5,是編譯器傻了嗎?不,這是因為,當有符號數與無符號數進行條件判斷時,編譯器會自動將有符號數隱式轉化為無符號數,這時,-5就會變成一個極大的無符號整數,所以造成了邏輯判斷上的錯誤。
當然,如果直接取兩者的運算結果的話,結果還是正確的。
所以,當進行條件判斷時,一定要注意條件運運算元兩端的數值的資料型別,以免造成判斷上導致的流程錯誤,這錯誤可能是致命的。