字节类型中的负值

tob*_*obi 3 c#

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

在以下代码中:

byte var = 0;
Console.WriteLine("{0}", ~var);
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 6

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

~(按位NOT)运算符无定义byte,但它是int.您的代码隐式扩展转换为int.您的代码大致相当于使用显式强制转换的此版本:

int temp = ~((int)var);
Console.WriteLine("{0}", temp);
Run Code Online (Sandbox Code Playgroud)

按位非运算符将位反转以给出结果111....111(基数2).它在二进制补码表示中的值为-1 .


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

byte x = 0;
byte result = (byte)~x;
Run Code Online (Sandbox Code Playgroud)

  • +1很好,清晰的解释.没有`Console.WriteLine(byte)`重载. (2认同)