Ah this just demonstrates the bit loss. Here is an example using 2 different width ints:
use Inline C => <<'EOC';
void poo () {
unsigned short s = 0xffff;
unsigned long l = (unsigned long) s;
printf("short %08x\n long %08x\n", sizeof(s), sizeof(l));
printf("short %08x\n long %08x\n", s, l);
s <<= 4; l <<= 4;
printf("short %08x\n long %08x\n", s, l);
s >>= 4; l >>= 4;
printf("short %08x\n long %08x\n", s, l);
if ( l != (unsigned long) s )
printf("Bugger!\nerror %08x\n", l^(unsigned long)s );
}
EOC
poo();
__END__
short 00000002
long 00000004
short 0000ffff
long 0000ffff
short 0000fff0
long 000ffff0
short 00000fff
long 0000ffff
Bugger!
error 0000f000
This is exactly what happens if you think you have a 32 bit int but actually have a 64 bit int. 2 operations and the results now differ.....