Я понимаю, что unsigned char означает символы ASCII от 0 до 255, но я не знаю, почему x печатает наши 44.
Потому что 2 * 150 равно 300, что больше 255 . 300 находится за пределами представимых значений unsined char в вашей системе.
Когда фактический результат операции arithmeti c выходит за пределы представимых значений целевого беззнакового типа, результат будет соответствовать фактическому результат по модулю количества представимых значений. 44 совпадает с 300 по модулю 256.
PS Для целочисленных типов со знаком, если результат операции arithmeti c выходит за пределы представимых значений, поведение программы будет неопределенным. Избегайте любой ценой.