【发布时间】:2011-01-20 13:38:20
【问题描述】:
我正在使用位移运算符(请参阅我的问题 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 operators 找不到任何东西),只是未定义行为的偶然事实,或者是否存在这种情况可能会产生一个错误?
【问题讨论】: