我正在 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);
我正在 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);
嗯......你希望它是什么?由于我们使用的是二补码表示,这就是它的简单方式:
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);
顺便说一句:反补否定运算符与补运算符加一相同(使用二补语表示时)。
所以:
-x == ~x + 1;
欲了解更多信息:http ://en.wikipedia.org/wiki/Signed_number_representations
.NET 中的负数int
被视为二进制补码。这意味着:
1111....111111 = -1
1111....111110 = -2
1111....111101 = -3
1111....111100 = -4
ETC; 基本上,负数x
等于2
base
-x
如果您不想要底片,请使用uint
而不是int
大多数计算上下文中的有符号整数(包括 C# 中的有符号整数:sbyte
、short
、int
和long
)使用二进制补码表示。其中,第一位表示符号,其余位表示数字。(0..127 从 0000 0000..0111 1111 开始计数,-128..-1 从 1000 0000..1111 1111 开始计数)
你可能一直期待的是你会得到一个无符号整数的按位恭维:
uint b = 1;
uint a = (uint)~b;
// a == 4294967294, which is 2^32-2, or in binary,
// 11111111 11111111 11111111 11111110
如果您的 8 位表示有符号值,则只有 1-7 位表示数字,第 8 位表示数字是正数 (0) 还是负数 (1)。
要获得所需的行为,您必须使用无符号类型。