C语言中乘除顺序引发的问题与收获 记录

C语言中乘除顺序引发的问题与收获 记录

本帖起因于学习到超子说物联网的“GD32/STM32单片机,OTA网络远程升级,手把手编写BootLoader程序教程”,需要实现将APP代码烧录到W25Q64中,再从W25Q64中更新到片上Flash的功能。在实现时一直有问题,从Bootloader代码跳转到片上Flash的APP代码时,代码中是有一个主堆栈指针MSP的有效性判断的,但判断结果是正常的,这个bug的点困扰我许久。通过将W25Q64上烧录的代码打印出来发现,代码的尾部数据写入异常,各种纠错下来发现了出现问题的点,故开此贴以记录。

int temp1,temp2,y;
temp1 = y / 8 * 4;
temp2 = y * 4 / 8;

​ 简化下来,我想记录的bug就是上面这段简单的代码,整型运算时“/”为取整操作。在学习C语言时应该也会有过类似的题目考查,很不幸我在自己写代码时没能引起足够重视,引发此次bug并耽误了自己不少时间。

​ 先说最大的收获点:整型运算下,将"/"运算符牢记为“除以某数并取整”;编写代码时涉及到3个以上操作数时,多代入几组数据测试一下代码运算结果是否和预期相符!!!!!

​ 后一个收获点我认为是更值得注意的地方,如果真的能一直牢记这点,我想不仅能让我很早的发现这个bug,也必将为我以后的代码之路上扫清一些障碍。而我需要付出的仅仅是代入一些简单数字的小学数学运算的时间。

​ "/"运算符取整的功能每个学习过C语言的人都知道(不止C语言),我也知道,但就是在使用时将它简化为“除”,脑海中快速思考并写出代码,然后一带而过,这就导致了问题的产生。

​ 列出几个数值对应表就能很明显地看出错误所在:

ytemp1 = y / 8 * 4;temp2 = y * 4 / 8;
000
100
201
301
  • 附上我bug前后的代码与串口打印信息
W25Q64_PageWrite(&UpdateA.Updata_A_Buff[i*256], UpdateA.Updata_A_from_W25Q64_Num * 64 * 1024 / 256 + (UpdateA.XModem_Count)*128/256+i);//失败代码

W25Q64_PageWrite(&UpdateA.Updata_A_Buff[i*256], UpdateA.Updata_A_from_W25Q64_Num * 64 * 1024 / 256 + (UpdateA.XModem_Count)/8*4+i);//成功代码

代码中UpdateA.XModem_Count的取值区间在大概[0, 60],如果仅是将失败代码中的“(UpdateA.XModem_Count)*128/256”改为“(UpdateA.XModem_Count)/256*128”也是不对的,读者朋友可以自己再思考思考。

  • ↓为失败程序输出信息
    失败程序输出信息

​ 这里使用失败的代码,可以看到W25Q64中存储的内容除了擦除后的1就是0,说明最后数据存储出现了问题;由于APP代码前面的部分是正常的,所以打印了"A分区代码MSP有效性判断通过“,并没有检测出错误。

  • ↓为成功程序输出信息
    成功程序输出信息

这里使用成功的代码,可以看到读取W25Q64中存储的内容是正常的,成功打印了APP代码初始化完成的串口提示信息,并能够接收串口的输入并打印出来。

  • 42
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值