有符號數和無符號數條件判斷時的坑

2020-09-25 11:00:29

描述

  在嵌入式程式設計過程中,最長接觸到的就是無符號數,但也不可避免的會遇到有符號數,當有符號數與無符號數相遇時,總會發生一些「奇妙的玄學」。而這「玄學」稍有不慎就會造成無法彌補的錯誤。
  來看下面一段程式碼

#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就會變成一個極大的無符號整數,所以造成了邏輯判斷上的錯誤。
當然,如果直接取兩者的運算結果的話,結果還是正確的。
所以,當進行條件判斷時,一定要注意條件運運算元兩端的數值的資料型別,以免造成判斷上導致的流程錯誤,這錯誤可能是致命的。