我正在查看一些C#IL反汇编,并且我注意到C#编译器添加了login id
操作,以确保移位操作的右侧始终小于以位为单位的字的大小。例如,
&
编译为
int word = 1 << x
和
int word = 1 << (x & 0x1F)
编译为
long word = 1L << x
我一直认为32位的移位运算大于31,而64位的移位运算大于63只会导致零,我的假设是否正确?当移位超过数据类型的大小时,会不会出现不确定的行为?如果没有,为什么C#编译器会这样做?