为什么(int)[@"-1" floatValue]不会返回-1?

3
我在gdb中测试了这个表达式:
(gdb) p (int)[@"-1" floatValue]
$2 = 1

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

第一个表达式为什么不返回-1?另外,[@"-1" floatValue]的返回类型是什么?

我预期的结果是什么。


我写了一些代码来测试结果 int d = [@"-1" floatValue]; float f = [@"-1" floatValue]; NSLog(@"%d, %f", d, f); 结果都是-1,这是正确的。所以这是gdb处理[@"-1" floatValue]值的问题。 - word_baby
1个回答

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发送消息,并将返回值视为float
这很重要,因为:
在i386平台上,返回浮点值的函数ABI与返回整数类型的函数ABI不兼容。因此,在i386平台上,必须对返回非整数类型的函数使用objc_msgSend_fpret。

3
我不知道这是否正确,但至少听起来很聪明有说服力 :-) - paxdiablo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接