考虑这个单元测试代码:
[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。这是为什么?
答案 0 :(得分:15)
int
上发生byte
促销活动,因为未为其定义二进制补充。
请参阅Unary numeric promotions和Bitwise 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
上使用时会有隐式广告。