VB.NET中的八进制转换

VB.NET中的八进制转换,vb.net,Vb.net,我对Oct功能有点困惑Oct(-8)不返回-10,它返回37770。我将只编写自己的函数,但有人知道为什么它会返回如此奇怪的结果吗 计算机如何用二进制表示负数? 多年来,人们一直梦想着用负数来表示,但为了把这个答案保留在论文的简短部分,我们只看两的补码。1 要计算负数的2的补码,我们使用以下步骤: 取数字的大小(也称为绝对值) 补全所有位(按位不补全) 向结果中添加1(简单相加) 那么二元补码中的-8是什么呢?首先,让我们将绝对值转换为二进制(为了简单起见,现在我们将使用8位。我已经用32位数字

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

计算机如何用二进制表示负数? 多年来,人们一直梦想着用负数来表示,但为了把这个答案保留在论文的简短部分,我们只看两的补码。1

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

  • 取数字的大小(也称为绝对值)
  • 补全所有位(按位不补全)
  • 向结果中添加1(简单相加)
  • 那么二元补码中的-8是什么呢?首先,让我们将绝对值转换为二进制(为了简单起见,现在我们将使用8位。我已经用32位数字得出了下面相同的答案。)

    | 8 |=>0000 1000
    
    下一步是对数字中的所有位进行补码

    0000 1000=>1111011
    
    最后,我们在结果上加1,得到我们两个的补码表示

    1111011
    +        1
    ----------
    1111000(别忘了随身携带)
    
    好,简单回顾一下八进制数。八进制,或基数8,是以更紧凑的方式表示二进制数的另一种方式。更敏锐的人会注意到8是2的幂,我们当然可以利用这一事实将负数转换成八进制

    为什么这会使
    Oct
    产生带有负数的奇怪结果?
    Oct
    函数对数字的二进制表示进行操作,将其转换为八进制(以8为基数)表示。让我们把8位数字转换成八进制

    1111000=>1111000=>0111000=>370
    
    请注意,由于
    8=2^3
    很容易转换,因为我们所要做的就是将数字分成三位一组,然后转换每组。(非常类似于通过将十六进制分解为4位的组来转换十六进制。)

    那么,如何获得
    Oct
    以生成常规结果呢? 使用
    Oct
    将数字的绝对值转换为八进制。如果数字小于0,则在前面粘贴负号

    使用32位数字的示例 我们将继续使用-8,因为它一直对我们很好。因此,将-8转换为2的补码得到:

    转换:0000 000
    反转:1111111111111111111111111111111111111111111111011
    加1:11111111111111111111111111111111111111000
    分开:1111111000
    Pad:011111 111 000
    换算:3770
    缩短:37770
    
    这将生成调用
    Oct(-8)
    时看到的结果

    有了这些知识,您现在还可以解释为什么
    Hex(-8)
    产生
    0xFFFFFFF8
    。(你可以看到为什么我在大多数情况下都使用了8位数字。)



    1有关二进制数的详细介绍,请查看

    这不是特定于.NET的,MS Calc给出了相同的输出。这是因为它表示负数。((位翻转)+1)与Hex()函数相同。日期来自尚不支持无符号整数的早期VB版本。否则,显示值的二进制表示就不简单了。如果您以前使用过DEC操作系统,您将永远不会喜欢Oct()。“还不支持无符号整数”blimey。。。