В Visual C++ хотел следующее следать: unsigned int d = (0x22224444<<0xAAA9DDDD); по идее d должно быть равно 0, но незультат равен 0x80000000, глянул в assembler код выглядит таким образом mov edi, 0x22224444 mov ecx, 0xAAA9DDDD shl edi, cl ок, тут видно что из ecx берётся только cl то есть 0xDD, но всё равно это в 6 раз больше чем 32 бита
shl берет только младшие 5 бит из cl - это будут 11101 в твоем случае, то есть 29. Получается: unsigned int d = (0x22224444<<29);
Да можно, но результат должен быть 0, а он 0x80000000. 0xAAA9DDDD больше 32, соответственно число должно уйти за пределы edi.
Всё проблема решина, всем большое спасибо, особенно Atlantic. Оказалось что есть процессоры которые 5 бит берут и которые 8. Для этого я сделал следующее, предположим d = x<<y; d = ((y & 0xFF) > 31 ? 0 : x << y );
y это любое число, но когда дело доходит до сдвига в x86 берутся первые 5 бит, а в ARM 8 бит. Например мы хотим сдвинуть на лево число 1 на 97(0b1100001), x86 селектирует только первые 5 бит 0b1100001 получается только 1, соответсвенно результат равен 2. ARM в свою очередь селектирует первые 8 бит 0b01100001 получается 97, соответсвенно результат уходит за границы 32 бит и равен 0.
Та народ, шо вы паритесь: xor edi,edi mov ecx,y test ecx,0ffffffe0h jnz @F mov edi,x shl edi,cl @@: mov x,edi Или, если говоря сишным языком: x = (unsigned int)y<32 ? x<<y : 0