2011-11-03 90 views
3

我測試在gdb這個表達式:爲什麼(INT)@ 「 - 1」 的floatValue]不返回-1

(gdb) p (int)[@"-1" floatValue] 
$2 = 1 

(gdb) p (int)((float)[@"-1" floatValue]) 
$7 = -1 

出來,因爲我希望

爲什麼第一個表達式不返回-1?另外,什麼是[@"-1" floatValue]的返回類型?

+0

我寫了一些代碼來測試結果 int d = [@「 - 1」floatValue]; float f = [@「 - 1」floatValue]; NSLog(@「%d,%f」,d,f); 結果是-1,這是正確的。所以這是gdb的問題,用[@「 - 1」floatValue]的值處理; –

回答

6

GDB不知道的方法(或功能)的返回類型:

(gdb) p [@"-1" floatValue] 
Unable to call function "objc_msgSend" at 0x155d08c: no return type information available. 
To call this function anyway, you can cast the return type explicitly (e.g. 'print (float) fabs (3.0)') 

當你施放的表達,int,GDB假定該方法返回一個int。所以它知道它可以使用objc_msgSend來發送消息並將objc_msgSend的返回值視爲int

當您將表達式轉換爲float時,gdb會假定該方法返回float。所以它知道它應該使用objc_msgSend_fpret發送消息並將返回值視爲浮點數。

這是重要的,因爲:

在i386平臺中,ABI返回浮點 值的函數是用於返回一個組成 型功能不兼容。因此,在i386平臺上,您必須使用objc_msgSend_fpret 作爲函數[返回非整數類型]的函數。

+3

我不知道這是否正確,但它至少_sounds_智能和令人信服:-) – paxdiablo

+0

我重寫它使其更清晰(我希望)。 –