c語言資料類型的轉換

來源:互聯網
上載者:User


代碼出現的整數字面值預設為int,浮點字面值預設為double。1.1為double型。

char a = 1; //1為int型float a = 0.1; // 0.1為double型int i = 0x8000000f; //這裡的0x8000000f為int型資料的補碼形式.printf("%d %x\n", i, i); //輸出:-2147483633   8000000f//可見printf()中的格式控制符%x也是輸出資料的補碼形式。

c語言資料類型的自動轉換遵循以下規則:

1)若參與運算量的類型不同,則先轉換成同一類型,然後進行運算。

2)轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型後再進行運算。

a.若兩種類型的位元組數不同,轉換成位元組數高的類型

b.若兩種類型的位元組數相同,且一種有符號,一種無符號,則轉換成無符號類型

3)所有的浮點運算都是以雙精確度進行的,即使僅含float單精確度量運算的運算式,也要先轉換成double型,再作運算。

4)在運算式中,char和short類型的值,無論有符號還是無符號,都會自動轉換成int或者unsignedint(如果short的大小和int一樣,unsignedshort的表示範圍就大於int,在這種情況下,unsignedshort被轉換成unsignedint)。因為它們被轉換成表示範圍更大的類型,故而把這種轉換稱為“升級(promotion)”。

5)  對於signed類型的擴充,看該資料的最高位,為1,則擴充的所有位都為1,為0,則擴充的位都為0
   對於unsigned signed類型的,所有擴充的位都為0
6)在賦值運算中,賦值號兩邊量的資料類型不同時,賦值號右邊量的類型將轉換為左邊量的類型。如果右邊量的資料類型長度左邊長時,將丟失一部分資料,這樣會降低精度,丟失的部分按四捨五入向前舍入。

轉換規則如所示。

double←── float高

long

unsigned

int←── char,short低


圖中橫向箭頭表示必須的轉換,如兩個float型數參加運算,雖然它們類型相同,但仍要先轉成double型再進行運算,結果亦為double型。縱向箭頭表示當運算子兩邊的運算數為不同類型時的轉換,如一個long型資料與一個int型資料一起運算,需要先將int型資料轉換為long型,然後兩者再進行運算,結果為long型。所有這些轉換都是由系統自動進行的,使用時你只需從中瞭解結果的類型即可。

樣本:

/*********************************************************************** Compiler: GCC* Last Update:  Fri 20 Apr 2012 12:12:56 AM CST************************************************************************/#include <stdio.h> int main(int argc, char **argv){    int a = -1;    unsigned int b = 1;    char c = 0x86; //char為有符號8位整型,0x86其實是負數    char d = 0xf4;    //當運算式中存在有符號類型和無符號類型時所有的運算元都自動轉換為無符號類型    //即無符號數比有符號數進階    if(a > b){        printf("(int)-1 > (unsigned int)2\n");    }    printf("%x\n", (unsigned int)-2); //-2轉換成無符號數後比1大    printf("%x\n", d + ((unsigned char)c << 8)); //本來以為會輸出0x86f4,但結果是0x85f4    //先將c轉換成無符號unsigned char: 0x86,然後系統會將其自動擴充成    //unsigned int: 0x00000086, 左移8位後變成0x00008600    //系統也會對d進行自動擴充成unsigned int: 0xfffffff4    //0x00008600 + 0xfffffff4 = 0x000085f4    //對於signed類型的擴充,看該資料的最高位,為1,則擴充的所有位都為1,為0,則擴充的位都為0    //對於unsigned signed類型的,所有擴充的位都為0    printf("%x\n", c << 8);    printf("%x\n", (unsigned char)0x86 << 8);    return 0;}

/*********************************************************************** Compiler: GCC* Last Update:  Sat 28 Apr 2012 10:37:47 PM CST************************************************************************/#include <stdio.h> int main(int argc, char **argv){    char a = -1;    printf("%c\n", a - 129);    //char參與運算,轉換成int    //-1 -129 = 130    //130的補碼形式是0xffffff7e    //char為8位,故截短,取低8位,即0x7e    //0x7e的ASCII碼是 ~    return 0;}

運行結果:

~

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

來自:http://bbs.ednchina.com/BLOG_ARTICLE_116361.HTM

http://www.cnblogs.com/jpcflyer/archive/2012/02/16/2353447.html

http://learn.akae.cn/media/ch15s03.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.