【发布时间】:2016-11-06 14:54:12
【问题描述】:
我正在尝试在 Arduino 中实现逻辑右移(即避免符号扩展),在阅读了 Arduino BitShift 指南 (https://www.arduino.cc/en/Reference/Bitshift) 后,它建议将无符号变量向右移动,不会导致符号扩展:
当您将 x 右移 y 位 (x >> y) 时,x 中的最高位是 a 1,行为取决于 x 的确切数据类型。如果 x 是类型 int,最高位为符号位,判断x是否为 正如我们上面讨论的那样,是否定的。在这种情况下,标志 由于深奥的历史原因,位被复制到低位:
int x = -16; // binary: 1111111111110000 int y = x >> 3; // binary: 1111111111111110 This behavior, called sign extension, is often not the behavior you want. Instead, you may希望零从左边移入。事实证明,对 unsigned int 表达式的移位规则不同,因此您可以使用 用于禁止从左侧复制的类型转换。
在我的测试中,它不是这样工作的:
Serial.print( ((uint32_t)(1<<15)) >> 15, BIN);
打印:
11111111111111111
也就是说,正在进行符号扩展。 我还尝试了那里的建议示例,结果相同。
我做错了吗? 另外是否可以进行移位并强制操作是逻辑而不是算术?
【问题讨论】:
-
如果您使用无符号整数开头,则可以取消强制转换,如
(1u << 15) >> 15。 -
>>超过负值是实现定义的行为。 -
@Someprogrammerdude 即使我这样做了,符号扩展仍然会发生,虽然 15 不是负数...
标签: c++ c arduino bit-manipulation bit-shift