Подтвердить что ты не робот

Цель C. Литье int для плавания

Извините за такой общий вопрос, но какой лучший (как можно быстрее и самый безопасный) метод для преобразования int в float в ObjC:

Первая

int b = 10;
float a = [[NSNumber numberWithInt: b] floatValue]

Будет экземпляр NSNumber, а сообщения numberWithInt, floatValue будут отправлены, правильно?

Второй

int b = 10;
float a = (float) b;

C-стиль: это с вызовом некоторой подпрограммы?

Или каким-то другим способом?

И почему?

4b9b3361

Ответ 1

Сводка типа C является самой чистой и простой для чтения. Если бы мне удалось найти код, который создал объект NSNumber, просто чтобы он сделал преобразование, это оставило бы меня вопросом: "Почему он так поступил? Что-то происходит здесь, кроме простого преобразования старого типа? не хватает?"

Что касается скорости, я подозреваю, что простое преобразование типов также было бы быстрее - объект NSNumber должен будет выполнять практически те же операции для преобразования, и имеет дополнительные накладные расходы на создание объектов и обмен сообщениями сверху того, что. Но, как и во всех таких случаях, не угадывайте - измеряйте. Профилируйте свой код, чтобы узнать, является ли конверсия узким местом, которое достаточно значимо, чтобы быть достойным вашего внимания.

Ответ 2

Поскольку вы спрашиваете о безопасности, первое, что вам нужно проверить, заключается в том, соответствует ли значение вашего int в float. В противном случае вы без потерь теряете данные. Если значение не очень мало, оно не подходит. Я бы переключился на использование double, поэтому вам не нужно беспокоиться об этом, а затем просто выполните назначение:

double d;
d = i;

Редко использование переменных типа float, как и short...

Ответ 3

Я действительно не вижу необходимости в объекте NSNumber, когда доступен прямой тип между двумя числовыми примитивами. Класс NSNumber не был предназначен только для преобразования типов.