0

为什么~((~0ULL) >> size << size)size1 和 64 之间计算为 0 时size = 64

4

2 回答 2

2

移动大于或等于该值大小的值是未定义的行为。

这可能是标准中保持移位操作足够快并且仅映射底层硬件操作的标准。

由于我不完全清楚的原因,例如即使在 x86 汇编中,移位也是以寄存器的大小为模完成的。我不是硬件工程师,但这可能是最有效的做法。

另一个不幸的限制是,按负数移位与沿相反方向按正数移位不同,而只是 UB。这有时需要在计算中添加额外的条件。

于 2013-10-09T04:37:24.443 回答
1

因为您正在做的是未定义的行为。不要将 64 位整数移动 64 位。

编辑添加: 当左侧操作数为负值时,为什么左移操作会调用未定义行为?

于 2013-10-09T04:32:38.570 回答