C#中的按位“〜”运算符

时间:2011-07-25 02:12:07

标签: c# binary bit-manipulation operator-keyword

考虑这个单元测试代码:

    [TestMethod]
    public void RunNotTest()
    {

        // 10101100 = 128 + 32 + 8 + 4 = 172
        byte b = 172;

        // 01010011 = 64 + 16 + 2 + 1 = 83
        Assert.AreEqual(83, (byte)~b);
    }

此测试通过。但是,如果没有字节转换,它将失败,因为“〜”运算符返回值-173。这是为什么?

2 个答案:

答案 0 :(得分:15)

int上发生byte促销活动,因为未为其定义二进制补充。

请参阅Unary numeric promotionsBitwise complement operator

从本质上讲,当您在无符号8位值~上调用10101100时,会将其提升为32位有符号值0...010101100。它的补码是32位值1...101010011,对于int,它等于-173。将此结果转换为byte是对无符号8位值01010011的降级,丢失最重要的24位。最终结果在无符号表示中被解释为83

答案 1 :(得分:3)

因为~返回一个int。请参阅 ~ Operator (C# Reference) (MSDN)

仅为int, uint, long, and ulong预定义 - 因此在byte上使用时会有隐式广告。