unsigned 和 int的計(jì)算有符號數(shù)和無符號數(shù)在一起運(yùn)算,不要以為遵循的仍然是短的向長的靠齊。以前我們知道,如果一個(gè)short和一個(gè)int在一起運(yùn)算,首先編譯器會將short自動轉(zhuǎn)換為一個(gè)int類型中間變量,然后進(jìn)行運(yùn)算。但是有符號數(shù)和無符號數(shù)在一起運(yùn)算的話,并不是這樣。借此機(jī)會,串下整形數(shù)據(jù)轉(zhuǎn)換的相關(guān)知識。 首先說說符號數(shù)和無符號數(shù)之間的轉(zhuǎn)換。無符號數(shù)可以轉(zhuǎn)換為有符號數(shù),有符號數(shù)也可以轉(zhuǎn)化為無符號整形,這之間的轉(zhuǎn)換一般編譯器也不會給出警告,因?yàn)檫@種轉(zhuǎn)換不涉及到bit丟失的情況,內(nèi)存內(nèi)容不會發(fā)生任何改變。僅僅是對這塊內(nèi)存的解釋不一樣而已。 例如: int a = -3; unsigned int b= a; // b= 65533 反之一樣。 編譯器里面有標(biāo)準(zhǔn)的轉(zhuǎn)換,這個(gè)是在整形運(yùn)算的時(shí)候出現(xiàn)。標(biāo)準(zhǔn)轉(zhuǎn)換的規(guī)則是:短的的向長的轉(zhuǎn);有符號的向無符號的轉(zhuǎn)。如果被轉(zhuǎn)換的數(shù)據(jù)比轉(zhuǎn)換后的數(shù)據(jù)要長的話,轉(zhuǎn)換可能會丟失bit數(shù)據(jù)。通常,編譯器會給出警告。 無符號數(shù)據(jù)和有符號整數(shù)進(jìn)行運(yùn)算,是有符號整數(shù)向無符號整數(shù)靠齊。這里,我們可以總結(jié)一條規(guī)則:整形數(shù)運(yùn)算,總是遵循一個(gè)原則:小的往大的擴(kuò)展。 從小到達(dá):short -> unsigned short -> int -> unsigned int 之所以這里有符號數(shù)類型長度比無符號數(shù)類型長度小,區(qū)別在于最高位使用與否。下面看看幾個(gè)例子: eg1: int a=-6; unsigned int b = 3; typeid(a+b)-----------------------unsigned int a+b結(jié)果:為一個(gè)很大的整數(shù) 潛在:int --> unsigned int eg2: unsigned short s1 = 3; int i2= -5; typeid(s1+i2) ----------------------int a+b結(jié)果:-2 潛在:unsigned short--> int eg3: unsigned int s1 = 3; long i2= -5; typeid(s1+i2) ---------------------unsigned int a+b結(jié)果:很大的正整數(shù) 潛在: long--> unsigned int 其它的如此類推 |
|