数据溢出与类型提升(keil下的C51)
【摘要】
来看这个,,
#include <stdio.h>
#include <reg52.h>
unsigned long a1,a2,a3,a4,a5,a6;
unsigned...
来看这个,,
#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
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
总结一下: 、
相同数据类型运算,转化为更长的数据类型再进行运算
不同数据类型运算,转化为最长的数据类型再进行运算
解释:比如两个都是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,错误
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
那按照上面的结论,我都是u16进行运算,先往更高一层转化,也就是转化为u32,u32对应最大42亿+,不应该溢出啊。。。。
emmmm,,,,,,,, 其实忽略一个重要的东西。。。
比unsigned int更高一层的是u32吗?
不,,,然后并不是。。。那么问题也就说的通了。
文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。
原文链接:recclay.blog.csdn.net/article/details/76357611
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)