Arithmetic bug

The following code gives bad result with my 8600 GTS :

uchar8 val = (uchar8)(0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0);
uchar8 res = (val & 0xF0) >> 4;
=> res == (0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF)
It should have been :
=> res == (0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F)

To get the intended result, I can still do :
res = (val >> 4) & 0x0F;