Целочисленная арифметика Objective-C - PullRequest
10 голосов
/ 16 ноября 2010

Я пытаюсь вычислить некоторые числа в приложении для iPhone.

int i = 12;
int o = (60 / (i * 50)) * 1000;

В этом примере я ожидаю, что o будет 100 (это миллисекунды), но оно равно 0, как показано NSLog (@ ")% d ", o).

Это также равно 0.

int o = 60 / (i * 50) * 1000;

Это равно 250 000, что является прямой математикой слева направо.

int o = 60 / i * 50 * 1000;

Что пролетает над моей головой?

Спасибо,
Ник

Ответы [ 7 ]

19 голосов
/ 16 ноября 2010

В Objective-C / выполняет целочисленное деление на целочисленных аргументах, поэтому 4/5 усекается до 0, 3/2 усекается до 1 и так далее. Возможно, вы захотите привести некоторые из ваших чисел к формам с плавающей запятой перед выполнением деления.

Вы также столкнулись с проблемами с приоритетом. В выражении

60 / (i * 50) * 1000

термин в скобках вычисляется первым, поэтому 60 делится на 600, что дает результат 0. В

60 / i * 50 * 1000

первая операция - разделить 60 на 12, что дает результат 5, а затем выполняются умножения.

4 голосов
/ 16 ноября 2010

Целое число, деленное на целое число, является целым числом.

, поэтому 60/600 это не 0.1, это 0.

Вместо этого (или объявите) некоторые вещи как float.

3 голосов
/ 16 ноября 2010

Заменить:

int o = (60 / (i * 50)) * 1000;

с:

int o = 1200/i;
1 голос
/ 16 ноября 2010

Это целочисленная математика.60 / (12 * 50) равно 0,1, усекается до 0.

Должно работать, если вы принудительно задаете число с плавающей запятой и затем приводите обратно к целому числу.все двойное.

0 голосов
/ 04 апреля 2012

Я думаю, вам нужно использовать float вместо int.Это будет работать так, как вы хотите!Вам также ответят в десятичных числах.

0 голосов
/ 16 ноября 2010

Все операции в вашем выражении выполняются в целочисленной арифметике, что означает, что дробная часть каждого промежуточного результата усекается. Это означает, что если вы разделите меньшее целое число на большее, вы всегда получите 0.

Чтобы получить желаемый результат, вы должны либо убедиться, что операции выполняются в определенном порядке, либо использовать поплавки. Например, результат

int o = (60.0 / (i * 50.0)) * 1000.0;

должно быть o = 100.

0 голосов
/ 16 ноября 2010

В порядке приоритета операция:

60 / (12 * 50) 

выполняется перед умножением на 1000.

Это значение меньше 1 и приведено к int, которое усекает его до 00 раз все равно 0.

Используйте float или сначала умножьте на 1000, чтобы убедиться, что вы не закончили с распространением 0 в своих вычислениях.

...