Почему (int) [@ "- 1" floatValue] не возвращает -1 - PullRequest
3 голосов
/ 03 ноября 2011

Я протестировал это выражение в gdb:

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

, но

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

получается так, как я ожидаю

Почему первое выражение не возвращает -1?Кроме того, каков тип возврата [@"-1" floatValue]?

1 Ответ

6 голосов
/ 03 ноября 2011

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 для функций, которые для функций [sic] возвращают нецелый тип.

...