Преобразование отрицаемого double в int

#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, поэтому мне придется смириться с этим.