Предполагая, что это C или C ++, ваша ошибка заключается в том, что Сдвиг влево отрицательного значения равен неопределенному поведению , а смещение влево значения со знаком, так что оно становится больше, чем MAX_INT, также является неопределенным поведением.
Если вы проверите значения a
и b
при выполнении этой последовательности, вы получите:
-1 1
-2 2
-4 4
...
-1073741824 1073741824
В этот момент a&b == 1073741824
.Но сдвиг его влево на 1 - это то же самое, что умножение на 2, что даст 2147483648
, что больше, чем INT_MAX.
Это неопределенное поведение.Система может сделать что угодно.Похоже, что в вашем случае, он сделал сдвиг бит, давая 0x80000000
.В подписанном int
это представляет INT_MIN.Поэтому в следующий раз в цикле вы пытаетесь сдвинуть влево отрицательное число, что снова является неопределенным поведением.Ваша система решила рассматривать это как исключение.
В общем, если вы выполняете битовые манипуляции, лучше всего использовать неподписанные типы.