2015-08-03 4 views
0

не могу понять поведение этого битового сдвига:Странное поведение битового сдвига

int container = 1; 

cout<<(container>>32)<<endl; 

Если это логический сдвиг на выходе должен быть 0, но это 1 вместо этого, как если бы это был циклический сдвиг. Когда я смотрю на разборку, я вижу, что эта команда используется SAR. Пожалуйста, объясните мне это поведение.

+2

http://stackoverflow.com/questions/18918256/is-right-shift-undefined-behavior-if-the-count-is-larger-than-the-width-of-the-t –

+0

Ваш компилятор должен предупредили об этом. Вы попробовали опцию '-Wall'? – 5gon12eder

+0

Visual Studio выдает предупреждение. В X86/X64 в 32-разрядных инструкциях сдвига операнда используются только нижние 5 бит подсчета, в этом случае: 32 & 0x1f == 0. Вы могли бы использовать контейнер >> = 31; контейнер >> = 1; и это будет работать (должно производиться 0 или -1 на X86/X64). – rcgldr

ответ

1

Вы переместили 32-разрядное число на 32, что приводит к неопределенному поведению, и результат 1 является совпадением.

+0

Да, это неопределенное поведение. Но я пробовал его с разными значениями, на разных компиляторах, и все равно одинаково. – goodking

+0

И это означает, что это не неопределенное поведение, потому что ...? Я бы попробовал его по другой архитектуре и посмотрел, что произойдет. – john

+0

Я не говорю, что это не неопределенное поведение. Я просто пытаюсь понять, почему так происходит. – goodking

Смежные вопросы