Objective-C 快速導覽 - 型態轉換

當運算式 (expression) 裡有不同基本資料型態 (basic data type) 的時候,編譯器 (compiler) 會在編譯時會自動進行型態轉換 (type conversion) ,例如運算中參雜整數及浮點數時

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    int a = 10;
    float b = 4.2;
    
    NSLog(@"%d", a / b);
    NSLog(@"%f", a / b);

    [pool drain];
    return 0;
}

/* 《程式語言教學誌》的範例程式
   http://pydoing.blogspot.com/
   檔名:autotype.m
   功能:Objective-c 程式範例
   作者:張凱慶
   時間:西元 2013 年 4 月 */


編譯執行,結果如下



程式的第 9 行
NSLog(@"%d", a / b);


印出的計算結果為非常大的奇怪負整數,這是因為 a / b 所得到的型態已經為浮點數,也就是 float 型態,這時用整數型態來列印,編譯器將 float 型態的位元編碼方式用整數的位元編碼方式來解釋,然後輸出給格式字串 %d ,所以才會是個奇怪的值。


第 10 行
NSLog(@"%f", a / b);


按預期的浮點數型態印出,顯示出的值就是正確的。


基本上, Objective-C 的型態轉換分為自動轉換及強制轉換,自動轉換方面如上例,凡是儲存範圍較小的型態,如 short 遇到 int ,就會自動轉換為儲存範圍較大的型態,也就是說 short 會自動轉換成 int


因此概略來說,字元、整數、浮點數三型態的自動轉換方向如下



字元可看成儲存範圍較小的整數型態,若以各基本資料型態的實際名稱來看,自動轉換方向如下



強制轉換則發生在利用 cast 運算子時,利用 cast 運算子,如下例
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    int a = 10;
    float b = 4.2;
    
    NSLog(@"%d", (int) (a / b));
    NSLog(@"%f", a / b);
    
    [pool drain];
    return 0;
}

/* 《程式語言教學誌》的範例程式
   http://pydoing.blogspot.com/
   檔名:casttype.m
   功能:Objective-c 程式範例
   作者:張凱慶
   時間:西元 2013 年 4 月 */


編譯執行,結果如下



程式的第 9 行
NSLog(@"%d", (int) (a / b));


我們重新加入了 cast 運算子,所以結果印出為整數無誤。


中英文術語對照
運算式expression
基本資料型態basic data type
編譯器compiler
型態轉換type conversion


您可以繼續參考
控制結構
型態轉換


相關目錄
Objective-C 快速導覽
Objective-C 教材
首頁



參考資料
Programming with Objective-C: About Objective-C
Programming with Objective-C: Working with Objects

沒有留言: