本節書摘來自華章計算機《編寫高品質代碼:改善c程式代碼的125個建議》一書中的第1章,建議2-2,作者:馬 偉 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
在讨論本建議話題之前,我們先看看下面的這段代碼的輸出結果,如代碼清單1-1
所示。
在代碼清單1-1中,或許大多數人都認為它輸出的結果應該是“i/c= 6”,但實際的輸出結果卻大相徑庭。前面已經講過,char類型的變量c可以有兩種類型:有符号的(signed char)和無符号的(unsigned char)。這裡假設char是8位的補碼字元類型,那麼代碼清單1-1就可能輸出“i/c=-8”(signed char)或者“i/c= 6”(unsigned char)兩種結果。其中,在microsoft visual studio 2010與gcc中的輸出結果都是“i/c=-8”,如圖1-4與圖1-5所示。

https://yqfile.alicdn.com/912b8589f10bc9e379bbcd2fa8df9ebd1d761fc7.png" >
其實,導緻這種結果最根本的原因就在于我們不能夠準确地确定char類型的變量c究竟是signed char類型還是unsigned char類型。是以,我們把決策權交給編譯器,而不同的編譯器預設的char類型是不同的,是以最後得到的結果也就不相同。
解決這種問題的辦法很簡單,就是顯式地将char類型的變量c聲明為signed char或unsigned char類型,這樣可保證結果的唯一性,如代碼清單1-2所示。
這樣就顯式地将char類型的變量c聲明為unsigned char類型,現在,後面的除法運算(i/c)與char的符号無關,是以代碼清單1-2輸出的結果為“i/c= 6”。