字节类型中的负值

时间:2012-12-13 09:17:44

标签: c#

我刚刚开始在C#上挣扎,我有一个问题。

在以下代码中:

byte var = 0;
Console.WriteLine("{0}", ~var);

为什么打印-1?从http://www.csharp-station.com/Tutorial/CSharp/Lesson02开始,我读到字节范围是0到255而〜(00000000)_2给出(11111111)_2等于(255)_10。

1 个答案:

答案 0 :(得分:6)

您要打印的值不是byte类型。它的类型为int

未为~定义byte(按位非)运算符,但它适用于int。您的代码隐含了对int的扩展转换。您的代码大致相当于使用显式强制转换的此版本:

int temp = ~((int)var);
Console.WriteLine("{0}", temp);

按位非运算符将这些位反转以得到结果111....111(基数2)。它在two's complement表示中的值为-1。


如果希望结果为值为255的字节,则必须添加显式强制转换:

byte x = 0;
byte result = (byte)~x;