Если я 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
(7 - 12) % 24
- это подписанное выражение, и присвоение ему unsigned int
заставляет вас видеть другой результат
В C %
- операция остатка, поэтому (7 - 12) % 24 = -5
unsigned(-5) = 4294967291 // since 4294967291 + 5 = 4294967296
Хотя Google и Python используют операцию модуля математики, результат равен 19. И 19 + 5 = 24
4294967291 + 5 = 4294967296
самом деле не объясняет почему, вы можете увидеть мой ответ на вопрос, который я связал выше для объяснения.
7-12 ans unsigned int (uint32) дает недополнение.
См. Также http://en.wikipedia.org/wiki/Modulo_operation для определения оператора для отрицательных чисел относительно языка программирования
uint32_t
имеет знака, что означает, что он ограничен положительными числами. Это также означает, что он имеет больший диапазон, так как подписанный байт может иметь значения от -127 до 127, но беззнаковый байт может иметь их от 0 до 255. Когда неподписанный int переполняется, он вернет большое число.
Причина, по которой int32_t
возвращает -5 вместо 19, заключается в том, что в C++ и С# оператор модуля фактически остается.
Также см. Этот пэп блога Эрика Липперта, который суммирует это удивительно. В частности...
"Оператор% не дает канонического модуля, он дает остаток".
Между тем, google дает канонический модуль, поскольку -123 mod 4 = 1
, а не -3
, как это было бы в C++ или С#.
Операция модуля фактически имеет несколько различных возможных определений, дающих различные результаты для отрицательных чисел. Определение C++ дает отрицательный результат (-5) для выражения (7 - 12) % 24
, и когда вы производите отрицательное значение для значения без знака, вы получаете этот странный результат. Это значение совпадает с тем, что вы получаете, если хотите:
uint32_t x = 0;
x = x - 5;
UMAX+1
чтобы получить действительное значение без знака. Например, преобразование-1
в unsigned всегда даст вам максимальное значение без знака для этого типа./
выполняет усечение до нуля, поэтому-5 / 24 == 0
.%
определяется так, что(a/b)*b + a%b == a
, поэтому оно должно быть-5
.