请问C语言无符号数与有符号数相加的问题?

unsigned char f1, f2, f3, f4, m1, m2, m3, m4;
char g1, g2, g3, g4, n1, n2, n3, n4;
f1 = 0xF2; g1 = 0x08; //-14 8
f2 = 0xF2; g2 = 0x12; //-14 18
f3 = 0x0E; g3 = 0xF8; //14 -8
f4 = 0x0E; g4 = 0xEE; //14 -18
printf("\n%d", (f1 + g1));
printf("\n%d", (f2 + g2));
printf("\n%d", (f3 + g3));
printf("\n%d", (f4 + g4));

运行结果:
250
260
6
-4

很多人都说无符号数和有符号数相加是按照无符号数处理的,
那这段代码后两个为什么是按照有符号数计算的?
有人说是因为溢出,好像不对吧?如果说是溢出了那第二行的260也溢出了啊?为什么260是按照无符号数输出的?

unsigned char和char做运算,两者首先都会被提升到int型,然后以int型运算,结果最终也为int型。所以,和有无符号毫无关系。追问

那为什么前两个按无符号数处理了,后两个按有符号数处理?

追答

你似乎没有看懂我的回答。
char类型的数参与运算,首先会被提升到int型。不论char有无符号,它都在int型的可表示范围内,因此提升为int型后有无符号没有区别,纯粹是值的加减运算。

追问

我再清楚的解释一下:
第一行:0xF2+0x08 如果都为int型,那应该为:242+8=250

输出没问题
第三行:0xF8+0x0E,如果都为int型,那应该同上:248+14=262
可现在输出为什么是6?

追答

首先char可以是signed char也可以是unsigned char,在你的系统上应该是signed char,那么:
f1 = 0xF2; g1 = 0x08; // f1无符号所以表示242,g1有符号所以表示8
f2 = 0xF2; g2 = 0x12; // f2无符号所以表示242,g2有符号所以表示18
f3 = 0x0E; g3 = 0xF8; // f3无符号所以表示14,g3有符号所以表示-8
f4 = 0x0E; g4 = 0xEE; // f4无符号所以表示14,g4有符号所以表示-18
printf("\n%d", (f1 + g1)); // 242+8=250
printf("\n%d", (f2 + g2)); // 242+18=260
printf("\n%d", (f3 + g3)); // 14+(-8)=6
printf("\n%d", (f4 + g4)); // 14+(-18)=-4
不知道我的回答够不够清楚。

追问

明白了,我把变量本来的定义忽略掉了,谢谢

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-09-10
这是因为%d是按至少2个字节处理的。所以char实际上就是int型,保存的是字符的ascii码,所以char基本上和int是通用的,因此两个char相加的结果是数字,也就不奇怪了。追问

谢谢

相似回答