1. 程式人生 > >小端模式與強制資料型別轉換

小端模式與強制資料型別轉換

        當運算元的型別不同,而且不屬於基本資料型別時,經常需要強制型別轉換,將運算元轉化為所需要的型別。強制型別轉換具有兩種形式,稱為顯式強制轉換和隱式強制型別轉換。

4.1.顯式強制型別轉換

         顯式強制型別轉換需要使用強制型別轉換運算子,格式如下:
  type(<expression>)
  或
(type)<expression>
其中,type為型別描述符,如int,float等。<expression>為表示式。經強制型別轉換運算子運算後,返回一個具有type型別的數值,這種強制型別轉換操作並不改變運算元本身,運算後運算元本身未改變,例如:
int nVar=0xab65;char cChar=char (nVar);
上述強制型別轉換的結果是將整型值0xab65的高階兩個位元組刪掉,將低端兩個位元組的內容作為char型數值賦值給變數cChar,而經過型別轉換後nVar的值並未改變。
4.2.隱式強制型別轉換
        隱式型別轉換髮生在賦值表示式和有返回值的函式呼叫表示式中。在賦值表示式中,如果賦值符左右兩側的運算元型別不同,則將賦值符右邊運算元強制轉換為賦值符左側的型別數值後,賦值給賦值符左側的變數。在函式呼叫時,如果return後面表示式的型別與函式返回值型別不同,則在返回值時將return後面表示式的數值強制轉換為函式返回值型別後,再將值返回,如:
int nVar;double dVar=3.88;nVar=dVar;//執行本句後,nVar的值為3,而dVar的值仍是3.88 
4.3.在使用強制轉換時應注意以下問題:
  1.型別說明符和表示式都必須加括號(單個變數可以不加括號),如把(int)(x+y)寫成(int)x+y則成了把x轉換成int型之後再與y相加了。
  2.無論是強制轉換或是自動轉換,都只是為了本次運算的需要而對變數的資料長度進行的臨時性轉換,而不改變資料說明時對該變數定義的型別。
       3.如果一個運算子兩邊的運算數型別不同,先要將其轉換為相同的型別,即較低型別轉換為較高型別,然後再參加運算,轉換規則如下圖所示。
  double ←── float 高
  ↑
  long
  ↑
  unsigned
  ↑
  int ←── char,short 低
  圖中橫向箭頭表示必須的轉換,如兩個float型數參加運算,雖然它們型別相同,但仍要先轉成double型再進行運算,結果亦為double型。 縱向箭頭表示當運算子兩邊的運算數為不同型別時的轉換,如一個long 型資料與一個int型資料一起運算,需要先將int型資料轉換為long型, 然後兩者再進行運算,結果為long型。所有這些轉換都是由系統自動進行的, 使用時你只需從中瞭解結果的型別即可。這些轉換可以說是自動的,但然,C語言也提供了以顯式的形式強制轉換型別的機制。
  4.當較低型別的資料轉換為較高型別時,一般只是形式上有所改變, 而不影響資料的實質內容, 而較高型別的資料轉換為較低型別時則可能有些資料丟失。
  5.當賦值運算子兩邊的運算物件型別不同時,將要發生型別轉換, 轉換的規則是:把賦值運算子右側表示式的型別轉換為左側變數的型別。 C語言賦值時的型別轉換形式可能會使人感到不精密和不嚴格,因為不管表示式的值怎樣,系統都自動將其轉為賦值運算子左部變數的型別。而轉變後資料可能有所不同,在不加註意時就可能帶來錯誤。 這確實是個缺點,也遭到許多人們批評。但不應忘記的是:c面言最初是為了替代組合語言而設計的,所以型別變換比較隨意。當然, 用強制型別轉換是一個好習慣,這樣,至少從程式上可以看出想幹什麼。

5.int ----->char型別轉化時的記憶體操作

        當我們把一個int型強制轉化為byte時,由於byte只有1個位元組,而int型是4個位元組,這樣就會產生截斷,int把它最低的記憶體空間裡的值放到了byte所對應的記憶體空間裡。如圖所示:
   char                           int
**********                  **********
* 1 Byte * <-----------* 1 Byte * 低位
**********                  ********** |
                                 * 1 Byte *   高位
                                 ********** |