В коде, который вы разместили, альфа трактуется как значение от 0 до 1, что, конечно, не работает, если вы используете альфа-канал в качестве беззнакового символа, используйте следующее, если вы хотите сделать это в целочисленном пространстве:
unsigned short background = 0x40;
unsigned short foreground = 0xe0;
unsigned short alpha = 0xc0;
unsigned short compositedcolor = (alpha * foreground + (0xff - alpha) * background) >> 8;
обратите внимание, что, хотя это шорты, все значения должны быть 0 - 255, шорт просто необходим в качестве вычислительного пространства для продуктов типа char * char, вы также можете использовать промежуточные приведения, но я просто использовал беззнаковые типы шорт для всех, чтобы сделать его более читабельным.