c++ - Arduino 上的位移位错误

标签 c++ arduino

我正在为 Arduino 2560 Mega 开发 C++ 库,我遇到了一个有趣的错误。

uint8_t resolution = 15;

uint32_t numDiscreteLevels = (1 << resolution);   //yields a value of 0xFFFF8000

uint32_t numDiscreteLevels = ((uint32_t)1 << resolution);   //yields 0x8000 (correct value)

似乎在第一行中,有符号位在分配给变量之前被填充到值上。根据推广规则,我认为 1 应该转换为无符号整数。但即便如此,我认为只有当你向左移动时才会出现带符号的填充。

最佳答案

在 AVR 架构上,一个 int是 16 位——不是 32 位!这意味着所有数字,包括整数常量,都被视为 int16_t。除非另有说明。

这意味着1 << 8(int16_t) 0x8000 , 不是 (int32_t) 0x00008000就像在 32 位平台上一样。由于这是一个带符号的值并且设置了高位,因此它是负数(具体来说,-32768),并将其符号扩展为 uint32_t。给出 0xffff8000 .

关于c++ - Arduino 上的位移位错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45625342/

相关文章:

c++ - 为什么 boost::filesystem 中止而不是抛出异常?

c++ - 更改 QT 布局背景

c++ - 将 2 uint16_t 转换为 32 浮点 IEEE-754 格式

algorithm - 寻找让机器人在房子里定位自己的方法

c++函数解析选择模板化版本而不是普通函数

c++ - 错误 : **** has not been declared

c++ - fstream 的默认模式

C++ 串行通信问题

c - 使用 Serial.write 串行发送字节数组时出错

arduino - 如何通过 adafruit mcp23017.h 库使用多个 mcp23017 芯片