在STM32单片机中运行该计算可以取出正确结果但是在51单片机中结果是错误的
unsigned long Freq;
unsigned char Freq1 = 60,Freq2 = 20,Freq1 = 10;
Freq = Freq1 * 10000 + Freq2 * 100 + Freq1 ;
通过如下添加类型强转发现结果又是正确的
unsigned long Freq;
unsigned char Freq1 = 60,Freq2 = 20,Freq1 = 10;
Freq = (unsigned long)Freq1 * 10000 + (unsigned long)Freq2 * 100 + (unsigned long)Freq1 ;
出现的原因可能是单片机位数不一致导致的
================================
关于单片机位数的思考(8位、16位、32位)
================================
8位、16位、32位是指单片机的“字长”,也就是一次运算中参与运算的数据长度,这个位是指二进制位。以8位为例,8位二进制的表达范围是0000,0000-1111,1111即十进制的0-255,即每次参与运算的数据最大不能超过255。而16位机的字长是16位,其数据表达范围是0-65535,即每次参与运算的数据最大不能超过65535;32位单片机的字长是32位,其数据表达范围是0-4294967295,即每次参与运算的数据最大不能超过4294967295。
================================
关于类型转换
================================


参考:
文章讨论了在STM32和51单片机中,由于位数差异导致的计算结果错误,并强调了类型转换在确保正确运算中的重要性。作者解释了8位、16位和32位单片机的字长及其运算范围限制。
826

被折叠的 条评论
为什么被折叠?



