C#位偏移:这种行为是规范中的错误还是偶然?
我当时正在使用位移位运算符(参见我的问题),一位SO用户指出了我计算移位操作数时的一个错误——我计算的是[1,32]的范围,而不是[0,31]的整数范围(SO社区万岁!) 在修复问题时,我惊讶地发现以下行为:C#位偏移:这种行为是规范中的错误还是偶然?,c#,bit-shift,C#,Bit Shift,我当时正在使用位移位运算符(参见我的问题),一位SO用户指出了我计算移位操作数时的一个错误——我计算的是[1,32]的范围,而不是[0,31]的整数范围(SO社区万岁!) 在修复问题时,我惊讶地发现以下行为: -1 << 32 == -1 -1我认为规范的相关部分如下: 对于预定义运算符,要移位的位数计算如下: 当x的类型为int或uint时,移位计数由 低阶五位计数。换句话说,计算移位计数 来自计数&0x1F 当x的类型为long或ulong时,移位计数由 低阶六位计数。换句话
-1 << 32 == -1
-1我认为规范的相关部分如下:
对于预定义运算符,要移位的位数计算如下:
- 当x的类型为int或uint时,移位计数由
低阶五位计数。换句话说,计算移位计数
来自计数&0x1F
- 当x的类型为long或ulong时,移位计数由
低阶六位计数。换句话说,计算移位计数
来自计数&0x3F
如果得到的移位计数为零,移位运算符只返回值
x。
值32
为0x20
。表达式0x20&0x1F
的计算结果为0
。因此,移位计数为零,不进行移位;表达式-1ah,当然。我读了那本书,但我一定是昏了头。这很有道理。谢谢
-1 << 32 == 0