c 類型轉換詳解

  當一個運算符的幾個操作數類型不一致時,就需要將其轉換成相同類型。

   一般來講,自動轉換是將“比較窄的”轉換成“比較寬的”,並不會丟失信息。例如:f + i時把i轉換成f

不允許使用無意義的表達式,如:下標不能爲浮點型。

對於丟失精讀的轉換,編譯器會給予警告:例如把int型轉換成char型。但該操作並不非法。

c語言標準沒有指定char類型是unsigned還是signed,當把char類型轉換成int時,對於不同的機器,結果不相同。

在某些機器中,若char最高位爲1,則轉換成複數,而在另一些機器中,char轉換時總在高位補零。

C語言的定義保證機器的標準打印字符集不會是負值,因此在表達式中這些字符重視正的。

wKiom1UVSECihqnOAASAHC6KpLE550.jpg如上爲ASCⅡ碼錶,最高位始終爲0,避免了字符集爲負的可能性。

  PS:爲了保證程序的可一致性,若在char中要存放非字符時,最好指定signed或者unsigned。

  在Windows平臺使用vc++6.0中,char默認爲signed。

隱式轉換:

  原則是將較低類型轉換成較高類型,如果沒有unsigned,可以使用下面的非正式規則;

  若其中一個爲long double,則將另一個轉換成long double型

  若其中一個爲double,則將另一個轉換成double

  若其中一個爲float,則將另一個轉換成float

  將 char和short 轉換成 int

  若其中一個爲long,將另一個轉換成long

  當包含unsigned時,轉換規則複雜一些

  例如:假設int爲16位,long爲32位

則 -long<unsigned int,因爲unsigned會被轉換成signed long。

但是 -long>unsigned long,因爲-long會被提升爲unsigned long。

  具體轉換規則參見文末。。。

    

 當把較長整數轉換成較短整數或char時,超出的部分會被丟棄,當把double轉換成float時,是四捨五入還是截取取決於編譯器的具體實現。

強制轉換:

    (類型名)表達式  例如 float b = 1.0; int a = (int)b;

  注意正確理解強制轉換:可以設想存在一個臨時變量,表達式首先被賦值到臨時變量,然後在用該臨時變量替換(類型名)表達式,運行該句後表達式的值並不會發生改變

  當存在函數原型時,會進行強制轉換,例如:存在double sqrt(double),則sqrt((double)2)等價於sqrt(2)


C語言轉換規則:

  (1)整數和浮點型:

    浮點型轉換成整型時,小數部分被省略,如果其值不能被整型表示,則其行爲未定義。注意:將負的浮點型轉換成unsigned int 結果是沒有定義的。

   當把整型轉換成浮點型時,如果該值是在可表示範圍內,則結果可能是下一個較高或者較低的可表示值。如果結果在範圍外,則行爲未定義。

  (2)浮點型:

    將較低精讀浮點型轉換成較高浮點型時:值不變。

    將較高精度轉換成較低精度時:在範圍內,值不變,在範圍外,結果爲定義

  (3)整型提升:

    如果原始類型都可以用int表示,則將其轉換成int,否則被轉換成unsigned int

  (4)整型轉換:

    將unsigned 轉換成 signed 時,如果可以在新類型表示,則表示,如果不能表示,結果與具體實現有關,將signed 轉換成unsigned時,若unsigned位數窄,對二進制補碼進行左截取,若unsigned寬,對signed進行符號擴展。

  (5)指針和整數:

    指針可加上或着減去一個整數,轉換規則按照加法運算符號方式進行,兩個指向同一數組的指針可進行加減運算,方式按照算數轉換規則,值爲0的整型常量或者void*型表達式可轉換成任意類型的指針,指針可以轉換成整型,注意整型必須足夠大,整型對象可以轉換成指針,一般用於將一個足夠寬的從指針轉換來的整型轉換成(恢復)指針,不同類型的指針間可以相互轉換,但必須滿足內存對齊條件,一個指針可以轉換成同意類型的另一個指針,但是可以增加或者刪除另一個指針的限制符,如果和另一個指針,增加了相同的修飾符,則和另一個指針一樣,如果刪除了修飾符,則底層對象的運算仍受到原聲明的限制。

        

思考下面三段代碼(平臺:Windows7  64位   開發工具:vc 6.0)  wKiom1UWDnbgCvRJAAC77T78UB0021.jpg wKioL1UWD62yFonQAACxEwddIbs144.jpgwKioL1UWD63hRDWzAAGsjj-5FzI552.jpg





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章