官术网_书友最值得收藏!

建議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”。

主站蜘蛛池模板: 华阴市| 夹江县| 泗水县| 高州市| 金塔县| 汉阴县| 招远市| 绥中县| 台山市| 美姑县| 婺源县| 额济纳旗| 镇雄县| 永康市| 波密县| 辛集市| 林甸县| 文昌市| 和龙市| 龙州县| 颍上县| 子长县| 集贤县| 虎林市| 正定县| 越西县| 蕲春县| 宁波市| 乐东| 天全县| 界首市| 兴海县| 东兰县| 弋阳县| 仁寿县| 启东市| 北宁市| 尖扎县| 弋阳县| 页游| 牟定县|