C 在短答案中加上两个字符会导致错误答案

C 在短答案中加上两个字符会导致错误答案,c,casting,C,Casting,我有一个函数,它的目标是将两个字符的值相加成一个短字符。似乎该值正在被截断或损坏 这是我的密码: char rotate(char a, char b){ unsigned short x = a + b; printf("init:%hu %hu = %hu\n", (unsigned char)a, (unsigned char)b, (unsigned short)x); if(x > 255){ x -= 255; } ret

我有一个函数,它的目标是将两个字符的值相加成一个短字符。似乎该值正在被截断或损坏

这是我的密码:

char rotate(char a, char b){
    unsigned short x = a + b;
    printf("init:%hu %hu = %hu\n", (unsigned char)a, (unsigned char)b,  (unsigned short)x);
    if(x > 255){
       x -= 255;
    }
    return (char) x;
}

unsigned char x = rotate((unsigned char)230, (unsigned char)100);
unsigned char y = rotate((unsigned char )200, (unsigned char)200);
unsigned char z = rotate((unsigned char) 230, (unsigned char)120);
结果是

init:230 100 = 74
init:200 200 = 65424
init:230 120 = 94

加法是用原始值完成的,是正确的

unsigned short x = a + b;
但显示是用转换后的值完成的

printf("init:%hu %hu = %hu\n", (unsigned char)a, (unsigned char)b, ....

打印
char
原始值

#if CHAR_MAX <= INT_MAX
  printf("a:%d b:%d\n", a, b);
#else
  // this is rare
  printf("a:%u b:%u\n", a, b);
#endif

#如果CHAR_MAX
65424

打开编译器警告。您的
add
函数返回
void
,但您正在分配其返回值。很抱歉,在我发布它时对其进行了修改,将其放回您希望将其添加为短字符的方式,但是您显式确保返回一个字符。为什么函数的参数没有未签名的字符,
x=a+b
不会在
x
中存储两个
char
值,它只存储它们的总和。此外,即使您成功地在
short
中存储了这两个值,您也会将其中一个值与转换回
字符一起丢弃。如果要使用
无符号字符
,为什么不将
添加
函数的函数参数声明为
无符号字符