- 編寫高質量代碼:改善C程序代碼的125個建議
- 馬偉 著
- 546字
- 2019-01-01 01:33:08
建議2-2:使用顯式聲明為signed char或unsigned char的類型來執行算術運算
在討論本建議話題之前,我們先看看下面的這段代碼的輸出結果,如代碼清單1-1所示。
代碼清單1-1 char使用示例
#include <stdio.h> int main(void) { char c=150; int i=900; printf("i/c=%d\n", i/c); return 0; }
在代碼清單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所示。

圖1-4 代碼清單1-1在Microsoft Visual Studio 2010中的輸出結果

圖1-5 代碼清單1-1在GCC中的輸出結果
其實,導致這種結果最根本的原因就在于我們不能夠準確地確定char類型的變量c究竟是signed char類型還是unsigned char類型。因此,我們把決策權交給編譯器,而不同的編譯器默認的char類型是不同的,所以最后得到的結果也就不相同。
解決這種問題的辦法很簡單,就是顯式地將char類型的變量c聲明為signed char或unsigned char類型,這樣可保證結果的唯一性,如代碼清單1-2所示。
代碼清單1-2 unsigned char使用示例
#include <stdio.h> int main(void) { unsigned char c=150; int i=900; printf("i/c=%d\n", i/c); return 0; }
這樣就顯式地將char類型的變量c聲明為unsigned char類型,現在,后面的除法運算(i/c)與char的符號無關,所以代碼清單1-2輸出的結果為“i/c=6”。