Я немного волнуюсь результатами, которые я получаю, когда я делаю арифметику по модулю в Objective C.-1% 3 выходят, чтобы быть-1, который не является правильным ответом: согласно моему пониманию, это должно быть 2.-2% 3 выходят к-2, который также не является правильным: это должно быть 1.
Есть ли другой метод, который я должен использовать помимо оператора % для получения корректного результата?
По модулю с отрицательными числами не так просто, как вы могли бы подумать. См. http://mathforum.org/library/drmath/view/52343.html
Objective-C является супермножеством C99, а C99 определяет a % b
как отрицательное, если a
отрицательно. См. также статью Википедии об операции Modulo и этот вопрос на StackOverflow.
Что-то вроде (a >= 0) ? (a % b) : ((a % b) + b)
(который не был протестирован и, вероятно, содержит ненужные круглые скобки) должен дать вам нужный результат.
ANSI C99 6.5.5 Мультипликативные операторы -
6.5.5.5: Результатом оператора /
является частное от деления первого операнда на второй; результат оператора %
- остаток. В обеих операциях, если значение второго операнда равно нулю, поведение не определено.
6.5.5.6: Когда целые числа делятся, результатом оператора /
является алгебраическое частное с отброшенной дробной частью (* 90). Если частное a / b
представимо, выражение (a / b) * b + a% b
будет равно a
.
* 90: Это часто называют «усечением до нуля».
Тип поведения по модулю, о котором вы думаете, называется «модульной арифметикой» или стилем «теории чисел» по модулю / остатку. Используя определение оператора по модулю модульной арифметики / теории чисел, бессмысленно иметь отрицательный результат. Это (очевидно) не стиль поведения по модулю, определенный и используемый C99. В способе C99 нет ничего «неправильного», это просто не то, чего вы ожидали. :)