一、在算术表达式中存在整型升级和寻常算术转化问题
(unsigned)char,(unsigned)short --> ( unsigned )int -->float -->double -->long double
float、double、long double为浮点型数据。当没有浮点型数据参与计算时,统一转为(unsigned)int
例如:
char a=1,b=1,c; printf("%d,%d",sizeof(c=a+b),sizeof(a+b));//结果为1,4 printf("%d",c);//报c未被初始化警告。说明上面c=a+b 并未对c进行赋值 printf(" %d ", sizeof 'A'); //结果为4 的结果是4, 是int的长度,编译器首先将'A'升级为整数97,再调用sizeof。 //以上说明1.计算中间转为了int类型,2、并未将运输结果赋值
int d = -1; if (d <= sizeof(arr)/sizeof(arr[0])) //sizeof返回unsigned int,故需将d看成unsigned int数据,所有d值非常大。
二、数据类型转换
2.1 长数据类型转为短数据类型,直接截断即可
2.2 短数据转长数据类型,需区别有无符号
unsigned int i = 257; char c = i;//结果 c = 1 signed char c = 128; unsigned int i = c;//i = 1111...1000,0000 最大值-128