我希望a,由于NOT 00000001会变成11111110,否则称为127,如果将最左边的位数作为符号,则使用-126,如果使用了sign& magnitude。
即使在2s赞美的情况下,我也希望得到的结果是-127
为什么结果是-2?
答案 0 :(得分:8)
在两个补充中:
-x = ~x + 1
从两边减去一个,我们可以看到:
~x = -x - 1
所以在你的例子中,如果我们设置x = 1
,我们得到:
~1 = -1 - 1 = -2
答案 1 :(得分:2)
考虑数字如何环绕。
如果我们从00000010
(2)开始并带走一个,那么它是:
00000010
- 00000001
---------
00000001
哪个是1.我们借#1"从列到左,就像我们使用十进制减法一样,除了因为它的二进制10 - 1
是1
而不是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
以获得更小的值。对于int
,byte
的值为11111110
,但由于254
首先征集~
,因此您获得int
而不是254。
-2
答案 2 :(得分:1)
要将负2赞美数转换为其十进制表示,我们必须:
因此,在11111110
中,我们看到符号位为1
(负数),而上面的方法产生数字000000010
,这是一个小数2.总之,我们因此得到-2
。