-20 не 1100 . Скорее всего (если ints 32-бит, и мы не говорим о нечетных платформах), 11111111111111111111111111101100 .
84 не 10000100 . Это 1010100 .
операция AND их вместе:
11111111111111111111111111101100
&
00000000000000000000000001010100
=
00000000000000000000000001000100 (68 decimal)
И тогда вы сдвигая -20 правый 68 позиций, которые есть 2 проблемы:
- правые сдвиги отрицательных чисел определяется реализацией, что ваш составителя реализация?
- сдвиги по количеству битов в значении или более, чем в результате этого неопределенного поведения
128-битных Интс вряд ли на общих платформах. 64-битные ints редки, но не невозможны, но для них 68> = 64 и поэтому вы должны получать неопределенное поведение.
Теперь, что это неопределенное поведение может выглядеть ...
Если наши Интс являются 32-разрядными, и мы делаем это на платформе x86 (или что-то подобное) достаточно, 68 должны получить отсекается CPU до 5 бит, оставив вас с графом сдвига 68 & 31 = 4.
И затем, принимая SAR
инструкцию (знак сохраняющих арифметический сдвиг вправо) используется для >>
, мы получаем (-20) SAR 4 = -2:
11111111111111111111111111101100
SAR
4
=
11111111111111111111111111111110 (-2 decimal)