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是按照无符号数输出的?
那为什么前两个按无符号数处理了,后两个按有符号数处理?
追答你似乎没有看懂我的回答。
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
不知道我的回答够不够清楚。
明白了,我把变量本来的定义忽略掉了,谢谢
谢谢