为什么8位字节中的〜1等于-2?

时间:2018-01-23 12:22:33

标签: c# math binary

我希望a,由于NOT 00000001会变成11111110,否则称为127,如果将最左边的位数作为符号,则使用-126,如果使用了sign& magnitude。

即使在2s赞美的情况下,我也希望得到的结果是-127

为什么结果是-2?

3 个答案:

答案 0 :(得分:8)

在两个补充中:

-x = ~x + 1

从两边减去一个,我们可以看到:

~x = -x - 1

所以在你的例子中,如果我们设置x = 1,我们得到:

~1 = -1 - 1 = -2

答案 1 :(得分:2)

考虑数字如何环绕。

如果我们从00000010(2)开始并带走一个,那么它是:

  00000010
- 00000001
 ---------
  00000001

哪个是1.我们借#1"从列到左,就像我们使用十进制减法一样,除了因为它的二进制10 - 11而不是9

再次取走1,我们当然得到零:

  00000001
- 00000001
 ---------
  00000000

现在,从那里拿走1,我们每次都从左边的列借来1,并且借用包裹我们,所以0 - 1 = -1是:

  00000000
- 00000001
-----------
  11111111

所以-1是全能的。

在另一个方向上更容易看到这一点,因为11111111加上一个必须00000000,因为它一直携带一个直到它丢失到左边,所以如果x是{{1}那么它必须是11111111的情况,所以它必须是-1。

带走另一个,我们有:

x + 1 == 0

所以 11111111 - 00000001 -------- 11111110 -2,当然1111110意味着翻转~1的每一位,也是00000001。因此11111110必须是~1

此处需要注意的另一个因素是C#中的算术和补码总是可以转换为-2以获得更小的值。对于intbyte的值为11111110,但由于254首先征集~,因此您获得int而不是254。

-2

答案 2 :(得分:1)

要将负2赞美数转换为其十进制表示,我们必须:

  • 从右到左开始扫描位串,直到遇到第一个'1'
  • 开始反转第一个'1'
  • 左边的每一位

因此,在11111110中,我们看到符号位为1(负数),而上面的方法产生数字000000010,这是一个小数2.总之,我们因此得到-2