Вопрос не вполне по C++, а скорее по железу, но все-таки.
Коллега неожиданно обнаружил. Что напечатает следующая программа?
#include <stdio.h>
int main()
{
unsigned sh = 0x2F;
unsigned v = 1u << sh;
printf("%u", v);
}
Ответ: 32768, что есть "1 << (sh & 31)". Сдвиг на 32 дает единицу.
При этом, в окне отладчика значение выражения "1<<sh" равно нулю. v = 1<<0x2F тоже дает ноль. Получается неувязочка. Как стандарт регламентирует поведение сдвигов? Или это считается HW dependent?
Просьба к тем, у кого есть под руками PPC, Sun, HP, SGI и прочие железяки — как там?
Так же интересно, как оно работает на Java и C# (ни того ни другого под руками нет).
Разумеется, речь идет о платформах с 32-битовыми интами.