找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

关于C语言unsigned int使用细节问题

查看数: 1784 | 评论数: 8 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-10-30 15:29

正文摘要:

使用unsigned int时为啥出现了图片的两种情况,1、用unsigned int cnt时判断表达式>=时计数到768就进入if里了 2、用unsigned int cnt时判断表达式==时计数到1000就进入if里了。二者理论上都应该是计数到1000进入if ...

回复

ID:883078 发表于 2021-10-31 19:05
谢谢各位的解答
ID:883078 发表于 2021-10-31 19:05
Hephaestus 发表于 2021-10-30 23:06
都不对,你没理解什么是原子操作。

对于8位单片机,16位的cnt不管是>=1000还是==1000都需要两步比较, ...

谢谢大佬解决了我的疑问
ID:401564 发表于 2021-10-31 13:02
Hephaestus 发表于 2021-10-30 23:06
都不对,你没理解什么是原子操作。

对于8位单片机,16位的cnt不管是>=1000还是==1000都需要两步比较, ...

好的,你是对的.
ID:883242 发表于 2021-10-30 23:06
Y_G_G 发表于 2021-10-30 22:37
unsigned int cnt是全局变量,而且cnt是在中断中改变的
if (cnt==1000)虽然在仿真时候能给你想要的结果
但 ...

都不对,你没理解什么是原子操作。

对于8位单片机,16位的cnt不管是>=1000还是==1000都需要两步比较,如果两次中间插入中断cnt++会破坏cnt的值,或者改变CY等标志位的状态,导致比较结果错误。

避免这种错误有两种解决办法。1)比较前关中断,比较后开中断。2)把定时中断时间间隔改成4ms,这样cnt就可以用unsigned char类型,不管是比较还是++都可以在一个指令内完成,不怕被中间打断。
ID:401564 发表于 2021-10-30 22:37
unsigned int cnt是全局变量,而且cnt是在中断中改变的
if (cnt==1000)虽然在仿真时候能给你想要的结果
但实际使用中,if (cnt>=1000)才是正确的
ID:883242 发表于 2021-10-30 19:07
188610329 发表于 2021-10-30 18:59
当使用8位机系统的时候, 如果 中断 和 主程序 都会操作同一个变量的时候,  那么, 这个变量应该避免 超过 ...

那就是原子操作的问题,楼主应该检查中断里面用到cnt没有。
ID:624769 发表于 2021-10-30 18:59
当使用8位机系统的时候, 如果 中断 和 主程序 都会操作同一个变量的时候,  那么, 这个变量应该避免 超过一个字节(8位)。尤其是当你使用的C语言,而不是汇编的话, 会有不可控的情况发生。
ID:419909 发表于 2021-10-30 18:12
个人觉得,你应该再审一下题,1和2是一样的unsigned int cnt

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表