Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
为什么~((~0ULL) >> size << size)在size1 和 64 之间计算为 0 时size = 64?
~((~0ULL) >> size << size)
size
size = 64
移动大于或等于该值大小的值是未定义的行为。
这可能是标准中保持移位操作足够快并且仅映射底层硬件操作的标准。
由于我不完全清楚的原因,例如即使在 x86 汇编中,移位也是以寄存器的大小为模完成的。我不是硬件工程师,但这可能是最有效的做法。
另一个不幸的限制是,按负数移位与沿相反方向按正数移位不同,而只是 UB。这有时需要在计算中添加额外的条件。
因为您正在做的是未定义的行为。不要将 64 位整数移动 64 位。
编辑添加: 当左侧操作数为负值时,为什么左移操作会调用未定义行为?