И что, он ни о чем не говорит. Ты берешь число со знаком, которое печатается как long. Расширения знака не происходит. Попробуй его напечатать как %d и увидишь. Более того, я несколько изменил код, в соответствии со своими заявлениями и все работает корректно
#include 
#include 
void main (void)
{
    unsigned char high_byte = 0xFF;  // -251 dec
    unsigned char low_byte  = 0x05;
    int result;
    result = low_byte | ((int)high_byte << 8);
    printf ("result = %d\n", result);
    result = low_byte | ( (int)(signed char)high_byte * 256 );
    printf ("result = %d\n", result);
    result = low_byte | ( (int)(signed char)high_byte << 8 );
    printf ("result = %d\n", result);
    getch ();
}
Можете проверить.