我正在为 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/