按整数大小进行位移时,5 位和 6 位分别是多少?

Enr*_*lis 2 c bit-shift undefined-behavior unsigned-integer

我专门指的是这篇文章的这一部分

过大的移位量:将 uint32_t 移位 32 位或更多位是未定义的。我的猜测是,这是因为不同 CPU 上的底层移位操作对此做了不同的事情:例如,X86 将 32 位移位量截断为5 位(因此 32 位移位与 0 移位相同)位),但 PowerPC 将 32 位移位截断为6 位(因此移位 32 会产生零)。由于这些硬件差异,C 语言完全未定义该行为(因此在 PowerPC 上移位 32 位可能会格式化您的硬盘驱动器,但不能保证产生零)。消除这种未定义行为的代价是编译器必须为变量移位发出额外的操作(如“与”),这将使它们在普通 CPU 上的成本增加两倍。

那5位6位是什么?

Tom*_*mmy 5

引用称,足够接近准确*硬件操作的转变n

  1. x86 CPU 将按n & 31位置移动(即,无论 的低五位的值是什么n);然而
  2. PowerPC 将按位置移动n & 63(即 的低六位的值n)。

* 如果没记错的话,最初的 8086 实际上并没有这样做。它会一直持续下去,直到它移动了一位、n多次,无论n是什么。但它也是一款已有 45 年历史的纯实模式 16 位处理器,因此您可能不会瞄准它。