经历了很惨痛的教训之后,我终于理解了整型提升(隐式类型转换)这个看起来很不经意的小东西,为了让我永远记住这个小教训,我决定把它写下来。(虽然我可能以后也不会这样写程序)
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = 0;
c = a + b;
printf("%d %d ",a+b,c);
system("pause");
return 0;
} //结果:300 44
int main()
{
char c;
unsigned char uc;
unsigned short us;
c = 128;
uc = 128;
us = c + uc;
printf("0x%x\n",us);
us = (unsigned char)c + uc;
printf("0x%x\n",us);
us = c + (char)uc;
printf("0x%x\n",us);
system("pause");
return 0;
} //结果:0x0 0x100 0xff00
这样的结果在我第一次看到简直觉得不可思议(事实上自我学习C语言来我不可思议的次数原本我能够毫无障碍地读懂一个程序的时候来的多得多得多),这里就涉及到整形提升。
C的整型算数运算总是至少以缺省整型类型的精度来进行的,为了获得这个精度,表达式中的字符型和短整型操作数在使用之前被转换为普通整型。(这句话出自《C和指针》)这样我们就可以很轻松地解决上面这两个小程序了。还有一个需要注意的地方是,char在表示整数时范围为-128到127,unsigned char的表示范围则是0到255.