繁体   English   中英

VB.NET中的八进制转换

[英]Octal conversion in VB.NET

我对Oct函数有点困惑。 Oct(-8)没有返回-10,它返回37777777770.我将编写自己的函数,但是有人知道为什么它会给出如此奇怪的结果吗?

计算机如何表示二进制中的负数?

多年来,我们已经设想了几种表示负数的方法,但为了将这个答案放在论文的短边,我们只会看两个补码。 1

要计算负数的二进制补码,我们使用以下步骤:

  1. 取数字的大小(又名它的绝对值)
  2. 补充所有位(按位不)
  3. 在结果中添加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的幂,我们当然可以利用这个事实将我们的负数转换为八进制。

为什么这会使Oct产生带有负数的奇怪结果?

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文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM