来看这个,,
#include <stdio.h>
#include <reg52.h>
unsigned long a1,a2,a3,a4,a5,a6;
unsigned char b=1;
unsigned char c=255;
unsigned int d=65535;
unsigned char e=255;
void main()
{
TI = 1;
while(1)
{
a1= b+c; // 结果:a1=256, 相同长度数据类型运算,转换为长度更长的一个数据类型后运算,
// b,c都是unsigned char,转unsigned int
printf("%ld\n",a1);
a2=b+d; // 结果:a2=0,不同长度数据类型运算,转换为长度最长的一个数据类型后运算,
printf("%ld\n",a2);
a3= b<<8; // 结果:a3=256 ,相同长度数据类型运算,转换为长度更长的一个数据类型后运算,
// b,8都是unsigned char,转unsigned int
printf("%ld\n",a3);
a4=c*e*2; // 结果:a4=64514,相同长度数据类型运算,转换为长度更长的一个数据类型后运算,
// c,e都是unsigned char,转unsigned int ,运算结果超int,所以错误。
printf("%ld\n",a4);
d=65535; // 结果:d=0xFFFF
d&=~(0x01);// 结果:d=0xFFFE,不同长度运算,转换为长度最长的一个数据类型后运算,符号扩展
// ~(0x01)=~(0000 0001)=1111 1110,扩展后为1111 1111 1111 1110
}
}
总结一下: 、
相同数据类型运算,转化为更长的数据类型再进行运算
不同数据类型运算,转化为最长的数据类型再进行运算
解释:比如两个都是u8,1字节的。运算先转化为u16,再进行运算。所以所谓的更长是再提升它们的基础上再提升一个数据类型。
而一个u8一个u16进行运算的时候转化为最长的一个,所谓的最长是再这两个之中的最长的一个也就是u16然后再进行运算。
然后,我就翻车了。。。
再来看下这个
void main()
{
unsigned long a;
unsigned int b=10000;
unsigned int c=9;
unsigned char d=9;
unsigned long e=9;
while(1)
{
a= b*c; // 执行结果:a=24464,错误
a= b*d; // 执行结果:a=24464,错误
a= b*e; // 执行结果:a=90000,正确
a= d*10000; // 执行结果:a=24464,错误
a= d*10000L; // 执行结果:a=90000,正确
a=b*c+e; // 执行结果:a=24473,错误
}
}
那按照上面的结论,我都是u16进行运算,先往更高一层转化,也就是转化为u32,u32对应最大42亿+,不应该溢出啊。。。。
emmmm,,,,,,,, 其实忽略一个重要的东西。。。
比unsigned int更高一层的是u32吗?
不,,,然后并不是。。。那么问题也就说的通了。