小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

c語(yǔ)言中的類型轉(zhuǎn)換

 angelbrian 2013-03-25
首先引出一個(gè)問(wèn)題,這是我在編寫模擬器程序的時(shí)候遇到的,我們有如下的類型轉(zhuǎn)換:

       int16_t     v16s;
       uint16_t   v16u;
       int32_t     v32s;
       uint32_t   v32u;

       v16s = 0xf08b;     v16u = (uint16_t)v16s; //請(qǐng)問(wèn)此時(shí)v16s和v16u在二進(jìn)制表示形式上有什么不同嗎? No.1
       v32s = (int32_t)v16s;      v32u = (uint32_t)v16s; //請(qǐng)問(wèn)此時(shí)v32s和v32u在二進(jìn)制表示形式上相同嗎? No.2
       v16s = 0x0f8b;  v32s=(int32_t)v16s;   v32u=(uint32_t)v16s; //請(qǐng)問(wèn)此時(shí)v32s和v32u的值又是多少? No.3
       v32s = 0xffff0fb8; v16s=(int16_t)v32s; v16u=(uint16_t)v32s;//請(qǐng)問(wèn)此時(shí)v16s和v16u的值是多少? No.4
       v16s = 0xf08b; v16u=0xf08b;  v32s=(int32_t)v16s; v32u=(uint32_t)v16u; //請(qǐng)問(wèn)此時(shí)v32s和v32u的值是多少? No.5

首先告訴大家答案:
  1. No.1:請(qǐng)問(wèn)此時(shí)v16s和v16u在二進(jìn)制表示形式上有什么不同嗎?
    二者在二進(jìn)制表示形式上沒(méi)有區(qū)別,都是0xf08b,所以如果不進(jìn)行運(yùn)算操作,在同樣長(zhǎng)度的簡(jiǎn)單數(shù)據(jù)類型之間進(jìn)行強(qiáng)制類型轉(zhuǎn)換是不必要的,編譯器會(huì)略去你的工作,不信的話,你可以查看生成的匯編代碼,對(duì)于No.1問(wèn)題對(duì)轉(zhuǎn)換語(yǔ)句,根本就不生成代碼??!
  2. No2:請(qǐng)問(wèn)此時(shí)v32s和v32u在二進(jìn)制表示形式上相同嗎?
    二者在二進(jìn)制表示形式上是相同的!都是0xfffff08b!這 里可能會(huì)犯錯(cuò)的地方在 v32u=(uint32_t)v16s這個(gè)語(yǔ)句上,我就是這么犯的錯(cuò)誤。按照我錯(cuò)誤的理解是:0xf08b → 0x0000f08b!這是不對(duì)的!原因后面再告訴你(當(dāng)然如果你C語(yǔ)言學(xué)的夠好,就覺(jué)得我再弄小兒科了^_^,照顧一下后進(jìn)者)。
  3. No.3:請(qǐng)問(wèn)此時(shí)v32s和v32u的值又是多少?
    此時(shí)v32s和v32u的值都是 0x00000f8b!
  4. No.4:請(qǐng)問(wèn)此時(shí)v16s和v16u的值是多少?
    此時(shí)v16s和v16u的值都是0x0fb8!
  5. No.5:此時(shí)v32s的值是0xfffff08b,v32u的值是0x0000f08b。在進(jìn)行自動(dòng)類型轉(zhuǎn)換的時(shí)候,如果原來(lái)的數(shù)是無(wú)符號(hào)數(shù),那么在擴(kuò)展的時(shí)候,高位填充的是0;如果是有符號(hào)數(shù),那么高位填充的時(shí)符號(hào)位!這一點(diǎn)有點(diǎn)類似于“>>”操作符,當(dāng)無(wú)符號(hào)數(shù)右移的時(shí)候,高位填充的是0;有符號(hào)數(shù)右移的時(shí)候,高位填充的是符號(hào)位。
    好了,下面我就來(lái)告訴你,為什么是上面的結(jié)果。這就需要我們回頭復(fù)習(xí)一下C語(yǔ)言的有關(guān)類型轉(zhuǎn)換的操作。C語(yǔ)言的類型轉(zhuǎn)換,可以分為兩種:自動(dòng)類型轉(zhuǎn)換(隱式類型轉(zhuǎn)換,有編譯器幫你去完成)和強(qiáng)制類型轉(zhuǎn)換(你知道自己想要什么,所以才轉(zhuǎn)換)。
    對(duì)于自動(dòng)類型轉(zhuǎn)換,最常見的就是混合運(yùn)算以及賦值運(yùn)算,還有一種就是函數(shù)值的類型轉(zhuǎn)換
  1. 賦值運(yùn)算:自動(dòng)把“=”右邊的表達(dá)式的類型轉(zhuǎn)換成“=”右邊的變量的類型,例如 int a=4.5; a的值實(shí)際是4!
  2. 混合運(yùn)算:就是一個(gè)運(yùn)算表達(dá)式當(dāng)中包含了多個(gè)類型,這時(shí)候就需要有類型轉(zhuǎn)換。當(dāng)運(yùn)算符兩邊的操作數(shù)類型不同時(shí),其中一個(gè)操作數(shù)就要經(jīng)過(guò)類型轉(zhuǎn)換以和另一個(gè)操作數(shù)的類型相一致,然后才能進(jìn)行運(yùn)算。
    變換操作數(shù)采取就高不就低的原則,即級(jí)別低的操作數(shù)先被轉(zhuǎn)換成和級(jí)別高的操作數(shù)具有同一類型,然后再進(jìn)行運(yùn)算,結(jié)果的數(shù)據(jù)類型和級(jí)別高的操作數(shù)相同。

           高        double    ←←    float
           ↑          ↑             
           ↑         long     
           ↑          ↑
           ↑        unsigned
           ↑          ↑
           低         int
          ←←    char,short

                 自動(dòng)轉(zhuǎn)換順序表

  3. 函數(shù)返回值的類型轉(zhuǎn)換: int f1(){ return 36.8;}
    強(qiáng)制類型轉(zhuǎn)換運(yùn)算符
    可以利用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符將一個(gè)表達(dá)式轉(zhuǎn)換成所需類型:
    例如:
  (double)a       (將a轉(zhuǎn)換成double類型)
     (int)(x+y)      (將x+y的值轉(zhuǎn)換成整型)
     (float)(5%3)    (將5%3的值轉(zhuǎn)換成float型)
     (int)(1.5+2.3) = ? 
      (int)1.5+2.3=?
    注意,表達(dá)式應(yīng)該用括號(hào)括起來(lái)。如果寫成(int)x+y 則只將x轉(zhuǎn)換成整型,然后與y相加。

    講到這里,您或許就明白了,哦,原來(lái)我們是使用了強(qiáng)制類型轉(zhuǎn)換的語(yǔ)法,但是程序?qū)嵸|(zhì)上卻是自動(dòng)類型轉(zhuǎn)換! 所以在執(zhí)行了語(yǔ)句:v16s = 0xf08b;  v32s=(int32_t)v16s;    v32u=(uint32_t)v16s; 后v32s和v32u的二進(jìn)制表示形式才是一樣的!
    對(duì)于從高到低的強(qiáng)制轉(zhuǎn)換,實(shí)質(zhì)上就是一個(gè)截?cái)嗟牟僮?,只把低端需要的部分保留,其余的部分直接扔掉了。所以?duì)于語(yǔ)句:
v32s = 0xffff0fb8; v16s=(int16_t)v32s; v16u=(uint16_t)v32s; 執(zhí)行之后v16s和v16u的二進(jìn)制表示形式才是一樣的!
    注:我一直強(qiáng)調(diào)的都是它們的二進(jìn)制表示形式是否相同,而沒(méi)有說(shuō)它們的值是否相同,因?yàn)橥瑯拥亩M(jìn)制表示形式,你把它當(dāng)作有符號(hào)數(shù)和無(wú)符號(hào)數(shù)的值在決大部分的情況下都是不同的(除了最高位為0的相同外,其他都不同)

    混合運(yùn)算

 混合運(yùn)算是指在一個(gè)表達(dá)式中參與運(yùn)算的對(duì)象不是相同的數(shù)據(jù)類型,例如:
  2*3.1416*r 3.1416*r*r 3.6*a%5/(*b)+'f';
 如果r為int型變量,a為float型變量,b為double型變量,則以上三個(gè)表達(dá)式中涉及到的數(shù)據(jù)類型有整型、實(shí)型、字符型,這種表達(dá)式稱為混合類型表達(dá)式。對(duì)混合類型表達(dá)式的求解要進(jìn)行混合運(yùn)算,此時(shí)首要的問(wèn)題是對(duì)參與運(yùn)算的數(shù)據(jù)進(jìn)行類型轉(zhuǎn)換。

下面給出類型轉(zhuǎn)換的示例,以加深理解。設(shè)有如下變量說(shuō)明:
  int a, j, y; float b; long d; double c;
  則對(duì)賦值語(yǔ)句:
  y=j+'a'+a*b-c/d;
  其運(yùn)算次序和隱含的類型轉(zhuǎn)換如下:
 ?、?計(jì)算a*b,由于變量b為float型,所以運(yùn)算時(shí)先由系統(tǒng)自動(dòng)轉(zhuǎn)換為double型,變量a為int型,兩個(gè)運(yùn)算對(duì)象要保持類型一致,變量a也要轉(zhuǎn)換為double,運(yùn)算結(jié)果為double型。
 ?、?由于c為double型,將 d 轉(zhuǎn)換成 double 型,再計(jì)算 c/d,結(jié)果為double型。
  ③ 計(jì)算j+'a',先將'a'(char型)轉(zhuǎn)換成整型數(shù)再與j相加,結(jié)果為整型。
 ?、?將第1步和第3步的結(jié)果相加,先將第3步的結(jié)果(int)轉(zhuǎn)換成double型再進(jìn)行運(yùn)算,結(jié)果為double型。
 ?、?用第4步的結(jié)果減第2步的結(jié)果,結(jié)果為double型。
 ?、?給y賦值,先將第5步的結(jié)果double型轉(zhuǎn)換為整型(因?yàn)橘x值運(yùn)算左邊變量y為整型),即將double型數(shù)據(jù)的小數(shù)部分截掉,壓縮成int型,然后進(jìn)行賦值。
  以上步驟中的類型轉(zhuǎn)換都是C語(yǔ)言編譯系統(tǒng)自動(dòng)完成的。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(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)遵守用戶 評(píng)論公約

    類似文章 更多