C#:移动左赋值运算符行为

我正在运行有时会产生这种情况的代码:

UInt32 current; int left, right; ... //sometimes left == right and no shift occurs current <<= (32 + left - right); //this works current <<= (32 - right); current <<= left; 

对于任何值> = 32,只显示值%32。 框架中是否出现了一些“优化”?

C#3.0语言规范,7.8“移位运算符”:

对于预定义的运算符,要移位的位数计算如下:

  • 当x的类型是int或uint时,移位计数由计数的低5位给出。 换句话说,移位计数是从count&0x1F计算的。
  • 当x的类型为long或ulong时,移位计数由计数的低6位给出。 换句话说,移位计数是从count&0x3F计算的。