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

wor*_*aby 3 casting objective-c nsstring

我在gdb中测试了这个表达式:

(gdb) p (int)[@"-1" floatValue]
$2 = 1
Run Code Online (Sandbox Code Playgroud)

(gdb) p (int)((float)[@"-1" floatValue])
$7 = -1
Run Code Online (Sandbox Code Playgroud)

按照我的预期出来

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

rob*_*off 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)')
Run Code Online (Sandbox Code Playgroud)

将表达式转换int为时,gdb假定该方法返回一个int.所以它知道它可以objc_msgSend用来发送消息并将返回值objc_msgSend视为一个int.

将表达式转换为a时float,gdb假定该方法返回a float.所以它知道它应该objc_msgSend_fpret用来发送消息并将返回值视为浮点数.

这很重要,因为:

在i386平台上,返回浮点值的函数的ABI与返回整数类型的函数的ABI不兼容.因此,在i386平台上,必须使用objc_msgSend_fpret作为函数[sic]返回非整数类型的函数.

  • 我不知道这是否正确,但它至少_sounds_智能和令人信服:-) (3认同)