查看: 530|回复: 4

[未解决] arduino 左移<< 和 >> 右移运算符出问题

[复制链接]

该用户从未签到

发表于 2021-10-25 11:22 | 显示全部楼层 |阅读模式
Serial.println((1 << 19,BIN);
Serial.println((int32_t)(1) << 19,BIN);
如上面第一句,打印出来的结果是0,第二句打印出来的结果是1000  0000  0000  0000  0000。
正常C语言是第一句和第二句的结果是一样的,都是1000  0000  0000  0000  0000。
为什么arduino  1 << 19 这样的表达式结果是0

签到天数: 71 天

[LV.6]常住居民II

发表于 2021-10-25 12:08 | 显示全部楼层
没强转他不一定是32位的,左移19再截取低八位或者低16位就变成0了

该用户从未签到

发表于 2021-10-25 12:36 | 显示全部楼层
本帖最后由 t3486784401 于 2021-10-25 12:48 编辑

"正常C语言是第一句和第二句的结果是一样的"

- LZ 学的 C 语言不正常;

- LZ 怕是不知道 8bit 平台和 32bit 平台下 int 的区别;

- 建议 LZ 养成看警告的习惯,Arduino 已经给出了警告:

2021-10-25_124303.png

就算换成其他编译器(例如ICCAVR),在 8bit 下都会有这个移位超限的警告:

2021-10-25_124315.png

该用户从未签到

 楼主| 发表于 2021-10-25 14:51 | 显示全部楼层
t3486784401 发表于 2021-10-25 12:36
"正常C语言是第一句和第二句的结果是一样的"

- LZ 学的 C 语言不正常;

谢谢提醒,我才发现我的编译器没有打开警告,打开警告后,如果这样的语句是在库函数中,也不会出现警告。

该用户从未签到

 楼主| 发表于 2021-10-25 14:54 | 显示全部楼层
XlinliY.Zhang 发表于 2021-10-25 12:08
没强转他不一定是32位的,左移19再截取低八位或者低16位就变成0了

是的,UNO板的int类型是16位的,字面常量的1被编译器认为是int类型的,向左移动19位,结果就是0,和我预想结果不一样。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

arduino解码sbus
arduino解码sbus
市面上有很多sbus接收机,它只有一根线就可以实现很多通道的通信,其本质利用了串口通
【干货分享】mega2560原理图PCB图纸altium designer18
【干货分享】mega2560原理
分享一下mega2560的板子 AD版本 **** 本内容被作者隐藏 **** ergo
wemos d1 wifi具体叫啥名,我也迷糊了,无法上传程序
wemos d1 wifi具体叫啥名
淘宝入手一块这样的板,详情页提供了教程,还提供了 arduino iDE 1.6.5免安装版本,
求大佬帮忙arudino上传报错programmer is not responding
求大佬帮忙arudino上传报
报错信息avrdude: stk500_recv(): programmer is not responding avrdude: stk500_get
新手求助!端口不显示的问题
新手求助!端口不显示的问
我的板子连到电脑上没有显示端口,试过安装ch340和驱动精灵都识别不出来,数据线也换
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表