Вы уже намекали на переполнение, и на самом деле это именно то, что здесь происходит. Вы уже знаете, что такое u
и u-1
(255 и 254 соответственно), поэтому давайте умножим их вместе. Это дает нам 64770, или в двоичном виде:
64770 = 1111 1101 0000 0010
Этот результат имеет ширину 16 бит, но мы храним его в uint8
, который имеет ширину всего 8 бит. Поэтому он усекается до 8 младших значащих битов. Математически это эквивалентно выполнению 64770 мод 2 ^ 8 или 64770 мод 256 . С программной точки зрения это эквивалентно выполнению 64770 & (1 << 7)
или 64770 & 256
:
64770 = 1111 1101 0000 0010
256 = 1111 1111
64770 & 256 = 0000 0000 0000 0010 = 2
Как бы вы ни представляли эту операцию, результат равен 2.