我正在使用位移运算符(请参阅我的问题Bit Array Equality)并且一个 SO 用户指出了我计算移位操作数时的一个错误——我计算的范围是 [1,32] 而不是 [0,31]一个整数。(为 SO 社区欢呼!)
在解决问题时,我惊讶地发现以下行为:
-1 << 32 == -1
事实上,它似乎n << s
被编译(或由 CLR 解释——我没有检查 IL),n << s % bs(n)
其中 bs(n) = n 的大小,以位为单位。
我本来期望:
-1 << 32 == 0
编译器似乎意识到您正在超出目标的大小并纠正您的错误。
这纯粹是一个学术问题,但有谁知道这是否在规范中定义(我在7.8 Shift 运算符中找不到任何东西),只是未定义行为的偶然事实,或者是否存在可能产生错误的情况?