#c #objective-c #c
#c #objective-c #c
Вопрос:
есть ли разница между следующими фрагментами кода?
double doubleMillis = -getSecondsSinceNow()*100; // returns double
int timestamp = (int) doubleMillis;
и
int timestamp = (int) -getSecondsSinceNow()*1000;
Я вижу различия в значениях, которые я получаю в timestamp. Первый, кажется, дает мне значимые результаты.
Когда я просто делаю:
int timestamp = -getSecondsSinceNow()*1000;
Я получаю результаты, аналогичные первому подходу.
Комментарии:
1. @Neil Если вы игнорируете часть NSDate / NSTimeInterval, то это так. 🙂
2. Там я отредактировал вопрос, чтобы не полагаться ни на какой Objective-C.
3. Нет, это не так, если вы не игнорируете квадратные скобки тоже.
4. @Neil согласился, теперь я обновил код.
5. Первое умножается на 100; второе на 1000. Это на порядок отличается.
Ответ №1:
здесь вы приводите возвращаемое значение getSecondsSinceNow() ( double
) к int
и умножаете его на 1000:
int timestamp = (int) -getSecondsSinceNow()*1000;
Что похоже:
int timestamp = ((int) -getSecondsSinceNow())*(1000);
В то время как в приведенных ниже случаях вы приводите полный результат:
Один явно:
double doubleMillis = -getSecondsSinceNow()*1000;
int timestamp = (int) doubleMillis;
И один раз неявно:
int timestamp = -getSecondsSinceNow()*1000;
так что да, разница есть.
Комментарии:
1. Хе-хе, так что приоритет меня задел. 😀
2. Я взял на себя смелость обновить ответ, чтобы не полагаться ни на какие материалы Objective-C. Ваш ответ применим к любому ‘C’
3. Конечно, без проблем, но вы пропустили два места, поэтому я это исправил.
Ответ №2:
Ни один из подходов не является надежным, поскольку вы преобразуете 64-разрядный double в 32-разрядное целое число. Вы будете терять информацию.
Комментарии:
1. Я осознаю этот риск, и я знаю, что мои данные не пересекут 2 ^ 31.
2. Проблема в том, что я передаю double другой функции, которая ожидает значение int, поэтому мне придется смириться с этим.