arduino 左移<< 和 >> 右移运算符出问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1788|回复: 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
发表于 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,和我预想结果不一样。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 21:54 , Processed in 0.076355 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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