VB.NET中的八进制转换
我对Oct函数有点困惑. 10月(-8)没有返回-10,它返回37777777770.我将编写自己的函数,但是有人知道为什么它会给出如此奇怪的结果吗?
解决方法
计算机如何表示二进制中的负数?
多年来,several ways一直被设想为代表负数,但为了将这个答案放在论文的短边,我们只会看两个补码. 要计算负数的二进制补码,我们使用以下步骤: >取数字的大小(又名它的绝对值) 那么两个补码二进制中的-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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |