gpt4 book ai didi

vb.net - VB.NET 中的八进制转换

转载 作者:行者123 更新时间:2023-12-03 00:09:31 24 4
gpt4 key购买 nike

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

最佳答案

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

多年来several ways人们一直梦想着用 来表示负数,但为了让这个答案保持在论文的简短部分,我们只考虑二进制补码。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 函数对数字的二进制表示形式进行操作,将其转换为八进制(基数 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

关于vb.net - VB.NET 中的八进制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32013062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com