为什么在-2中按位补码为1

时间:2013-05-10 11:46:31

标签: c#

我正在尝试使用C#中的一些按位运算符,不确定恭维如何计算输出为-2为1

如果我用8位二进制表示1

1 = 00000001

~1 = 11111110 =为什么评价为-2?

    Sample code that i am using in C#


    //Bitwise Compliment
    //1  = 00000001
    //~1 = 11111110 = -2
    Console.WriteLine(~1);

7 个答案:

答案 0 :(得分:7)

嗯......你希望它是什么?由于我们使用两个补充表示,因此它就是这样的:

00000011 = 3
00000010 = 2
00000001 = 1
00000000 = 0
11111111 = -1
11111110 = -2
11111101 = -3
11111100 = -4

如果我们使用 one-complient 表示,我们会​​有这个列表,然后你就是对的:

00000011 = 3
00000010 = 2
00000001 = 1
00000000 = 0
11111111 = -0 <== Watch this!!!
11111110 = -1
11111101 = -2
11111100 = -3

由于计算机制造商决定不会出现负零,因此他们创建了双补码表示。

如果执行按位补码,则所有位都反转。因此00000001会产生11111110,而这只是-2(使用双补码时)。

您是否正在寻找否定运算符-

Console.WriteLine(-1);

BTW:De complement negate运算符与补码运算符加1(使用双补语表示时)。

所以:

-x == ~x + 1;

了解更多信息:http://en.wikipedia.org/wiki/Signed_number_representations

答案 1 :(得分:3)

.NET中的否定int数字被视为two's-complement。这意味着:

1111....111111 = -1
1111....111110 = -2
1111....111101 = -3
1111....111100 = -4

等;基本上,否定x等于2 base -x

如果您不想要否定,请使用uint代替int

答案 2 :(得分:1)

.NET(和大多数语言)使用two's complement来表示负数。在最简单的解释中,可以通过one's complement(包括反转每个位)然后添加1来找到它。

你的反演会产生一个补码,它被解释为一个而不是两个补码。

答案 3 :(得分:0)

大多数计算上下文中的有符号整数(包括C#中的有符号整数:sbyteshortintlong)都使用Two's complement表示表示。在此,第一位表示符号,其余表示数字。 (0..127计数从0000 0000..0111 1111,-128 ..- 1计数从1000 0000..1111 1111)

你可能期待的是你对无符号int的按位赞美所得到的:

uint b = 1;
uint a = (uint)~b;
// a == 4294967294, which is 2^32-2, or in binary,
// 11111111 11111111 11111111 11111110

答案 4 :(得分:0)

如果您的8位代表有符号值,则只有1-7位表示数字,第8位表示该数字是正数(0)还是负数(1)。

要获得所需的行为,您必须使用无符号类型。

答案 5 :(得分:0)

因为使用Two's Complement,所以反转所有位,并添加一个。所以这就是整个过程:

11111110 ; start
00000001 ; invert
00000010 ; add one

来源:link

答案 6 :(得分:0)

首先,~运算符的工作方式与

类似
~x = -x - 1

在.NET中,使用twos-complement

调用负整数
11111111 = -1
11111110 = -2