关于c语言位运算溢出与ASCII码问题

今天做c语言题,题目是输入两个字符,将他们的ASCII码最高四位进行与运算,最低四位进行异或运算,输出之后的字符。以下是代码


#include<stdio.h>
int main()
{
    char a,b,c,d,e;
    scanf("%c%c",&a,&b);
    c=(a>>4)&(b>>4);
    c=c<<4;
    d=(a<<4)^(b<<4);
    d=d>>4;
    e=c|d;
    printf("%c\n",e);
    
}

我当然知道还有更好的解决方法,比如int类型然后取模运算等,但是我很好奇,在提交后的测试样例中,唯独 ''M'' ''R''这两个字符一起输入的时候会出现错误,导致最后输出的时候e的值通过%d输出为-1,目前经过初步判断,问题出在异或运算中,在ASCII吗77在位移过后出现问题。想请问一下大家,究竟为何会出现这种问题,c语言在char类型位移溢出的时候是如何处理的,如何解决这个问题呢?

溢出后会发生截断。还会只截取低八个bit位。数据在内存中存放是补码。