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

问题描述 投票:0回答:2

考虑这个单元测试代码:

    [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。这是为什么?

c# binary bit-manipulation operator-keyword
2个回答
19
投票

升级到

int
发生在
byte
,因为没有为它们定义二进制补码。

请参阅按位和移位运算符数字提升的文档。

本质上,当您对无符号 8 位值

~
调用
10101100
时,它会提升为 32 位有符号值
0...010101100
。它的补码是 32 位值
1...101010011
,对于
int
来说等于 -173。将此结果转换为
byte
会降级为无符号 8 位值
01010011
,丢失最高有效的 24 位。最终结果被解释为无符号表示形式中的
83


4
投票

因为

~
返回一个int。请参阅 ~ 运算符(C# 参考) (MSDN)

它仅为

int, uint, long, and ulong
预定义 - 因此在
byte
上使用它时会存在隐式转换。

© www.soinside.com 2019 - 2024. All rights reserved.