有符號(hào)整型和無(wú)符號(hào)數(shù)整型舉例
??輸出結(jié)果為:1 解析??無(wú)符號(hào)整型和有符號(hào)整型比較時(shí),有符號(hào)整型會(huì)轉(zhuǎn)化成無(wú)符號(hào)整型。因此,-1轉(zhuǎn)化為無(wú)符號(hào)數(shù)為0xFFFFFFFF,所以a>b,輸出1。 有符號(hào)字符型和無(wú)符號(hào)字符型舉例
??輸出結(jié)果:0 解析??要解釋以上這個(gè)現(xiàn)象,首先要明白整型提升: ??整型提升是C程序設(shè)計(jì)語(yǔ)言中的一項(xiàng)規(guī)定:在表達(dá)式計(jì)算時(shí),各種整形首先要提升為int類型,如果int類型不足以表示則要提升為unsigned int類型;然后執(zhí)行表達(dá)式的運(yùn)算。 ??整型提升的意義在于:表達(dá)式的整型運(yùn)算要在CPU的相應(yīng)運(yùn)算器件內(nèi)執(zhí)行,CPU內(nèi)整型運(yùn)算器(ALU)的操作數(shù)的字節(jié)長(zhǎng)度一般就是int的字節(jié)長(zhǎng)度,同時(shí)也是CPU的通用寄存器的長(zhǎng)度。因此,即使兩個(gè)char類型的相加,在CPU執(zhí)行時(shí)實(shí)際上也要先轉(zhuǎn)換為CPU內(nèi)整型操作數(shù)的標(biāo)準(zhǔn)長(zhǎng)度。通用CPU(general-purpose CPU)是難以直接實(shí)現(xiàn)兩個(gè)8比特字節(jié)直接相加運(yùn)算(雖然機(jī)器指令中可能有這種字節(jié)相加指令)。所以,表達(dá)式中各種長(zhǎng)度可能小于int長(zhǎng)度的整型值,都必須先轉(zhuǎn)換為int或unsigned int,然后才能送入CPU去執(zhí)行運(yùn)算。(來(lái)源百度百科) ??舉個(gè)例子
??輸出結(jié)果為:4 d 1。 ??第8行,按理來(lái)說(shuō)應(yīng)該輸出1的,但是這里輸出的是4.因?yàn)?,進(jìn)行a和b都為char型,a+b時(shí),會(huì)將a和b提升為int型計(jì)算,所以會(huì)輸出4。 ??第11行,c為char型,計(jì)算a+b時(shí),其實(shí)是先提升為int型,再轉(zhuǎn)換為char型賦值給c,進(jìn)行了兩次類型轉(zhuǎn)換。所以,printf時(shí),c是char型,輸出d(ASCII:100) ??同樣的,第12行輸出的就是1。 ??接下來(lái)回到本題中,a = -1,提升為int型為-1,b = 1,提升為int型為1,所以結(jié)果為0。 有符號(hào)整型和無(wú)符號(hào)字符型舉例
??輸出結(jié)果為:0。 解析??整型提升,b轉(zhuǎn)化為int型為0xFF,所以a<b。輸出0。 有符號(hào)字符型和無(wú)符號(hào)整型舉例
輸出結(jié)果:1。 解析??char類型被擴(kuò)展為unsigned int后與b相等,同為0xFFFFFFFF
結(jié)論??1.無(wú)符號(hào)int與有符號(hào)int比較大小,都轉(zhuǎn)化為無(wú)符號(hào)int來(lái)比較。 ??2.int類型與非無(wú)符號(hào)int的類型比較時(shí),非無(wú)符號(hào)int的類型轉(zhuǎn)化為int來(lái)比較。 ??3.無(wú)符號(hào)int類型與其他類型如unsigned short,signed short,unsigned char, char 比較時(shí),其他類型一律轉(zhuǎn)化為無(wú)符號(hào)int類型來(lái)比較。 ??4.非無(wú)符號(hào)int類型和非int類型如unsigned short,signed short,unsigned char, char 比較時(shí),一律轉(zhuǎn)化為int類型來(lái)比較。
|
|