C#中的按位"〜"运算符

S. *_*ont 13 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

Tug*_*tes 16

由于没有为它们定义二进制补码而int发生促销byte.

请参见一元数字促销按位补码运算符.

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

  • 男人`byte`数据类型是一种皇家的痛苦. (10认同)