Почему оператор по модулю (%) неявно приводится к левой стороне, а не к правой стороне в C #? - PullRequest
3 голосов
/ 18 февраля 2011

Возьмите следующий код:

long longInteger = 42;
int normalInteger = 23;
object rem = longInteger % normalInteger;

Если rem - это остаток от longInteger / normalInteger, не должен ли остаток всегда быть ограничен меньшим по размеру "int", делителем?Тем не менее, в C # приведенный выше код приводит к rem, являющемуся long.

Безопасно ли конвертировать rem в int без потери данных?

int remainder = Convert.ToInt32(rem);

Ответы [ 3 ]

4 голосов
/ 18 февраля 2011

Нет перегрузки оператора по модулю, который принимает long и int, поэтому int будет преобразован в long для соответствия другому операнду.

Просмотр этогона более низком уровне в CPU нет отдельной инструкции для вычисления по модулю, это всего лишь один из результатов операции деления.Результатом операции является результат деления и напоминание.Оба имеют одинаковый размер, поэтому в результате деления должно быть long, как и напоминание.

Поскольку напоминание должно быть меньше делителя, вы можете безопасно привести результат кint когда делитель происходит от int.

1 голос
/ 18 февраля 2011

Независимо от того, какие у вас два целых числа, результат должен быть ниже, чем "normalInteger". Следовательно, результат «rem» будет ограничен пределами типа int. Таким образом, будет безопасно преобразовать rem в int без потери данных.

0 голосов
/ 18 февраля 2011

да, это не проблема, функция конвертирования округляет результат.тогда вы должны знать, полезно ли это для вас или нет.

...