(7 - 12) мод 24 равен 19, но в C ++ он равен 4294967291

0

Если я google (7 - 12) mod 24 я получаю ответ 19.

Когда я это делаю C++, я получаю 4294967291

uint32_t hour = (7 - 12) % 24;
// hour = 4294967291

Если я попробую int32_t

int32_t hour = (7 - 12) % 24;
// hour = -5
  • 0
    Когда вы конвертируете singed в unsigned, вы добавляете или вычитаете UMAX+1 чтобы получить действительное значение без знака. Например, преобразование -1 в unsigned всегда даст вам максимальное значение без знака для этого типа.
  • 1
    В C ++ / выполняет усечение до нуля, поэтому -5 / 24 == 0 . % определяется так, что (a/b)*b + a%b == a , поэтому оно должно быть -5 .
Показать ещё 1 комментарий
Теги:
math

4 ответа

4
Лучший ответ

(7 - 12) % 24 - это подписанное выражение, и присвоение ему unsigned int заставляет вас видеть другой результат

В C % - операция остатка, поэтому (7 - 12) % 24 = -5

unsigned(-5) = 4294967291 // since 4294967291 + 5 = 4294967296

Хотя Google и Python используют операцию модуля математики, результат равен 19. И 19 + 5 = 24

C, Python - различное поведение операции modulo (%)

  • 0
    Сказать, что 4294967291 + 5 = 4294967296 самом деле не объясняет почему, вы можете увидеть мой ответ на вопрос, который я связал выше для объяснения.
1

7-12 ans unsigned int (uint32) дает недополнение.

См. Также http://en.wikipedia.org/wiki/Modulo_operation для определения оператора для отрицательных чисел относительно языка программирования

  • 0
    Имеет смысл. Почему результат int32_t не соответствует Google?
  • 0
    @blindsamuel stackoverflow.com/questions/1082917/…
Показать ещё 4 комментария
1

uint32_t имеет знака, что означает, что он ограничен положительными числами. Это также означает, что он имеет больший диапазон, так как подписанный байт может иметь значения от -127 до 127, но беззнаковый байт может иметь их от 0 до 255. Когда неподписанный int переполняется, он вернет большое число.

Причина, по которой int32_t возвращает -5 вместо 19, заключается в том, что в C++ и С# оператор модуля фактически остается.

Также см. Этот пэп блога Эрика Липперта, который суммирует это удивительно. В частности...

"Оператор% не дает канонического модуля, он дает остаток".

Между тем, google дает канонический модуль, поскольку -123 mod 4 = 1, а не -3, как это было бы в C++ или С#.

  • 1
    Так? ...........
  • 0
    @RobertHarvey Итак, остаток! = Модуль
Показать ещё 7 комментариев
0

Операция модуля фактически имеет несколько различных возможных определений, дающих различные результаты для отрицательных чисел. Определение C++ дает отрицательный результат (-5) для выражения (7 - 12) % 24, и когда вы производите отрицательное значение для значения без знака, вы получаете этот странный результат. Это значение совпадает с тем, что вы получаете, если хотите:

uint32_t x = 0;
x = x - 5;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню