Я работал с операторами сдвига битов (см. Мой вопрос Битовое равенство массивов ), и пользователь SO указал на ошибку в моем вычислении операнда сдвига - я вычислял диапазон [1, 32] вместо [0,31] для цел. (Ура для SO сообщества!)
При устранении проблемы я с удивлением обнаружил следующее поведение:
-1 << 32 == -1
На самом деле может показаться, что n << s
компилируется (или интерпретируется CLR - я не проверял IL) как n << s % bs(n)
, где bs (n) = размер, в битах, n.
Я бы ожидал:
-1 << 32 == 0
Казалось бы, компилятор понимает, что вы смещаетесь за пределы цели и исправляете свою ошибку.
Это чисто академический вопрос, но кто-нибудь знает, определено ли это в спецификации (я не смог найти ничего в 7.8 Операции сдвига ), просто случайный факт неопределенного поведения или есть случай, когда это может привести к ошибке?