午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

整形提升和類(lèi)型轉(zhuǎn)換

 changqiong0606 2012-08-05
K&R C中關(guān)于整型提升(integral promotion)的定義為:

"A character, a short integer, or an integer bit-field, all either signed or not, or an object of enumeration type, may be used in an expression wherever an integer maybe used. If an int can represent all the values of the original type, then the value is converted to int; otherwise the value is converted to unsigned int. This process is called integral promotion."

上面的定義歸納下來(lái)就是以下兩個(gè)原則:

    1). 只要一個(gè)表達(dá)式中用到了整型值,那么類(lèi)型為char、short int或整型位域(這幾者帶符號(hào)或無(wú)符號(hào)均可)的變量,以及枚舉類(lèi)型的對(duì)象,都可以被放在這個(gè)整型變量的位置。
    2). 如果1)中的變量的原始類(lèi)型值域可以被int表示,那么原值被轉(zhuǎn)換為int;否則的話(huà),轉(zhuǎn)為unsigned int。
   
    以上兩者作為一個(gè)整體,被稱(chēng)為整型提升(Integral promotion)

    整型提升的概念容易與普通算術(shù)類(lèi)型轉(zhuǎn)換產(chǎn)生混淆。這兩者的區(qū)別之一在于后者是在操作數(shù)之間類(lèi)型不一致的情況下發(fā)生,最終將操作數(shù)轉(zhuǎn)換為同一類(lèi)型。而在算術(shù)運(yùn)算這種情景下,即使操作數(shù)具有相同的類(lèi)型,仍有可能發(fā)生整型提升。

    例如:

   
char a , b ,c;
c
=+ b;


    在上述過(guò)程中,盡管兩個(gè)運(yùn)算符"+"和"="的操作數(shù)全為char型,但在中間計(jì)算過(guò)程中存在著整數(shù)提升:對(duì)于表達(dá)式a+b ,a、b都是char型,因此被提升至int型后,執(zhí)行“+”運(yùn)算,計(jì)算結(jié)果(int型)再賦值給c(char型),又執(zhí)行了隱式的類(lèi)型轉(zhuǎn)換。

    是不是有一種很不相信的感覺(jué)?Me too,然而標(biāo)準(zhǔn)就是標(biāo)準(zhǔn)。可以使用下面的代碼證明上面所描述的過(guò)程。

printf ( " the size of the result of a+b :%d " ,sizeof( a+b) );



    理解了整型提升的概念后,面對(duì)下面這個(gè)C語(yǔ)言的FAQ,你應(yīng)該不會(huì)產(chǎn)生困惑了

   “ 為什么語(yǔ)句 printf( "%d",sizeof ('A') );  的輸出結(jié)果是4呢?char類(lèi)型長(zhǎng)度不是1字節(jié)么? ”

    最后提一句,ANSI C規(guī)定,編譯器如果能保證保證運(yùn)算結(jié)果一致,也可以省略類(lèi)型提升的操作——這通常出現(xiàn)在表達(dá)式中存在常量操作數(shù)的時(shí)候。

**********************************
unsigned char a=0xA5;
unsigned char b=~a>>4;
printf("b=%d\n",b);
取反的優(yōu)先級(jí)高于移位。
1:整值提升
0xA5 == 10100101 -> 00000000 00000000 00000000 10100101

2:取反
00000000 00000000 00000000 10100101 -> 11111111 11111111 11111111 01011010

3:右移
11111111 11111111 11111111 01011010 >> 4 == 11111111 11111111 11111111 11110101(算術(shù)移位) 或者 00001111 11111111 11111111 11110101(邏輯移位)

4:截?cái)?BR>b == 0xf5即245

--------------------------------------------------------------------------------------------------------

類(lèi)型轉(zhuǎn)換:不同類(lèi)型的數(shù)值數(shù)據(jù)進(jìn)行混合運(yùn)算時(shí),要先轉(zhuǎn)換成同一類(lèi)型之后再運(yùn)算。

1.自動(dòng)類(lèi)型轉(zhuǎn)換 

 
其中,float->double,char->int是必定要進(jìn)行的。
2.強(qiáng)制類(lèi)型轉(zhuǎn)換

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多