我对Oct函数有点困惑. 10月(-8)没有返回-10,它返回37777777770.我将编写自己的函数,但是有人知道为什么它会给出如此奇怪的结果吗? 计算机如何表示二进制中的负数? 多年来,several ways一直
多年来,several ways一直被设想为代表负数,但为了将这个答案放在论文的短边,我们只会看两个补码.
要计算负数的二进制补码,我们使用以下步骤:
>取数字的大小(又名它的绝对值)
>补充所有位(按位不)
>在结果中添加1(简单添加)
那么两个补码二进制中的-8是多少?首先让我们将绝对值转换为二进制(为了简单起见,我们现在将工作在8位.我已经用32位数字得出了相同的答案.)
|8| => 0000 1000
下一步是补充数字中的所有位
0000 1000 => 1111 0111
最后,我们在结果中加1,得到我们的二进制补码表示
1111 0111 + 1 ---------- 1111 1000 (Don't forget to carry)
好的,简要回顾一下八进制数.八进制或基数8是以更紧凑的方式表示二进制数的另一种方式.更敏锐的观察者会注意到8是2的幂,我们当然可以利用这个事实将我们的负数转换为八进制.
为什么这会使10月产生带有负数的奇怪结果?
Oct函数对数字的二进制表示进行操作,将其转换为八进制(Base 8)表示.那么让我们将8位数转换为八进制数.
1111 1000 => 11 111 000 => 011 111 000 => 370
请注意,由于8 = 2 ^ 3,因此很容易转换,因为我们所要做的就是将数字分成三位组并转换每组. (很像是如何通过分成4位组来转换十六进制.)
那么我如何让Oct产生常规结果呢?
使用Oct将数字的绝对值转换为八进制.如果数字小于0,请在前面贴上负号.
使用32位数字的示例
我们将留在-8因为它一直对我们这么好.因此将-8转换为二进制补码给出:
Convert: 0000 0000 0000 0000 0000 0000 0000 1000 Invert: 1111 1111 1111 1111 1111 1111 1111 0111 Add 1: 1111 1111 1111 1111 1111 1111 1111 1000 Separate: 11 111 111 111 111 111 111 111 111 111 000 Pad: 011 111 111 111 111 111 111 111 111 111 000 Convert: 3 7 7 7 7 7 7 7 7 7 0 Shorten: 37777777770
当你打电话给Oct(-8)时,会产生你看到的结果.
有了这些知识,您现在还可以解释为什么Hex(-8)产生0xFFFFFFF8. (你可以看到为什么我在大多数情况下都使用了8位数字.)
1有关二进制数的过于详细的介绍,请查看Wikipedia article