История изменений
Исправление beastie, (текущая версия) :
Тут вот есть кое-какое объяснение:
http://stackoverflow.com/questions/3871650/gcc-left-shift-overflow
Соль в том, что шифтинг на больше чем «ширина» типа — это u.b., чем многие и пользуются для оптимизаций. В частности используя только 5 младших бита правого аргумента (в частности на i386 и производных). Что мы собственно в твоём случае и наблюдаем.
TL;DR, твой код эквивалентен:
for (i = 0; i <= 64; i++)
printf("i = %d; x = 0x%08x\n", i, (0x1 << (i & 0xf)));
Исправление beastie, :
Тут вот есть кое-какое объяснение:
http://stackoverflow.com/questions/3871650/gcc-left-shift-overflow
Соль в том, что шифтинг на больше чем «ширина» типа — это u.b., чем многие и пользуются для оптимизаций. В частности используя только 5 младших бита правого аргумента (в частности на i386 и производных). Что мы собственно в твоём случае и наблюдаем.
Исправление beastie, :
Тут вот есть кое-какое объяснение:
http://stackoverflow.com/questions/3871650/gcc-left-shift-overflow
Соль в том, что шифтинг на больше чем «ширина» типа — это u.b., чем многие и пользуются. В частности используя только 5 младших бита правого аргумента (в частности на i386 и производных). Что мы собственно в твоём случае и наблюдаем.
Исходная версия beastie, :
Тут вот есть кое-какое объяснение:
http://stackoverflow.com/questions/3871650/gcc-left-shift-overflow
Соль в том, что т.к. шифтинг на больше чем «ширина» типа — это u.b., чем многие и пользуются. В частности используя только 5 младших бита правого аргумента (в частности на i386 и производных). Что мы собственно в твоём случае и наблюдаем.