【问题标题】:C# bit shift: is this behavior in the spec, a bug, or fortuitous?C# 位移:​​规范中的这种行为、错误还是偶然的?
【发布时间】:2011-01-20 13:38:20
【问题描述】:

我正在使用位移运算符(请参阅我的问题 Bit Array Equality),一位 SO 用户指出了我计算位移操作数时的一个错误——我计算的范围是 [1,32] 而不是 [0 ,31] 为整数。 (SO 社区万岁!)

在解决问题时,我惊讶地发现以下行为:

-1 << 32 == -1

事实上,n &lt;&lt; s 似乎被编译(或由 CLR 解释——我没有检查 IL)为 n &lt;&lt; s % bs(n) 其中 bs(n) = n 的大小,以位为单位。

我早就料到了:

-1 << 32 == 0

编译器似乎意识到您正在超出目标的大小并纠正您的错误。

这纯粹是一个学术问题,但有谁知道这是否在规范中定义(我在7.8 Shift operators 找不到任何东西),只是未定义行为的偶然事实,或者是否存在这种情况可能会产生一个错误?

【问题讨论】:

    标签: c# bit-shift


    【解决方案1】:

    我相信规范的相关部分在这里:

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

    • 当 x 的类型是 int 或 uint 时,移位计数由 计数的低五位。换句话说,计算移位计数 来自计数和 0x1F。

    • 当 x 的类型为 long 或 ulong 时,移位计数由 计数的低六位。换句话说,计算移位计数 来自计数和 0x3F。

    如果结果移位计数为零,移位运算符只需返回值 x。

    32 的值是0x20。表达式 0x20 &amp; 0x1F 的计算结果为 0。因此,移位计数为零,不进行移位;表达式-1 &lt;&lt; 32(或任何x &lt;&lt; 32)只返回原始值。

    【讨论】:

    • 啊,当然。我读到了,但我的大脑一定是空白的。完全有道理。谢谢!
    猜你喜欢
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    相关资源
    最近更新 更多