if語句在signed int和unsigned int之間測試相等性,按照上面的說法,可以這樣解釋:
首先,signed int和unsigned int長度相同,不會(huì)向更長的方向轉(zhuǎn)換。
其次,signed int不能完整地表示unsigned int的所有值。
因此,signed int d被轉(zhuǎn)換為unsigned int類型。
這樣,-1就變成一個(gè)非常巨大的正整數(shù),導(dǎo)致比較結(jié)果與預(yù)期的不符,解決的方法是使用強(qiáng)制轉(zhuǎn)換,(int)(sizeof(arr)/sizeof(arr[0]))。
我在VC++ 6.0和DEV-C++ 4.9.9.0中嘗試了上面那段代碼,的確如此。
不要因?yàn)闊o符號(hào)數(shù)不存在負(fù)值而用它表示數(shù)量(如年齡、國債等),盡量使用int之類的有符號(hào)數(shù),這樣在混合運(yùn)算中,這樣就不必?fù)?dān)心邊界情況(如-1被翻譯為非常大的正數(shù))。
只有在使用位段和二進(jìn)制掩碼時(shí),才使用無符號(hào)數(shù);應(yīng)該在表達(dá)式中使用強(qiáng)制類型轉(zhuǎn)換,使所有的操作數(shù)均為有符號(hào)數(shù)或無符號(hào)數(shù),這樣就不必由編譯器來選擇結(jié)果的類型。
C語言中的類型轉(zhuǎn)換比一般人想象中的要廣泛得多,在涉及類型小于int或double的表達(dá)式中,都有可能出現(xiàn)類型轉(zhuǎn)換。
printf(" %d ", sizeof ’A’);
的結(jié)果是4, 是int的長度,編譯器首先將’A’升級(jí)為整數(shù)97,再調(diào)用sizeof。
首先,signed int和unsigned int長度相同,不會(huì)向更長的方向轉(zhuǎn)換。
其次,signed int不能完整地表示unsigned int的所有值。
因此,signed int d被轉(zhuǎn)換為unsigned int類型。
這樣,-1就變成一個(gè)非常巨大的正整數(shù),導(dǎo)致比較結(jié)果與預(yù)期的不符,解決的方法是使用強(qiáng)制轉(zhuǎn)換,(int)(sizeof(arr)/sizeof(arr[0]))。
我在VC++ 6.0和DEV-C++ 4.9.9.0中嘗試了上面那段代碼,的確如此。
不要因?yàn)闊o符號(hào)數(shù)不存在負(fù)值而用它表示數(shù)量(如年齡、國債等),盡量使用int之類的有符號(hào)數(shù),這樣在混合運(yùn)算中,這樣就不必?fù)?dān)心邊界情況(如-1被翻譯為非常大的正數(shù))。
只有在使用位段和二進(jìn)制掩碼時(shí),才使用無符號(hào)數(shù);應(yīng)該在表達(dá)式中使用強(qiáng)制類型轉(zhuǎn)換,使所有的操作數(shù)均為有符號(hào)數(shù)或無符號(hào)數(shù),這樣就不必由編譯器來選擇結(jié)果的類型。
C語言中的類型轉(zhuǎn)換比一般人想象中的要廣泛得多,在涉及類型小于int或double的表達(dá)式中,都有可能出現(xiàn)類型轉(zhuǎn)換。
printf(" %d ", sizeof ’A’);
的結(jié)果是4, 是int的長度,編譯器首先將’A’升級(jí)為整數(shù)97,再調(diào)用sizeof。

