2014-09-04 634 views
5

您好,我想知道它是如何可能转换为十六进制负值(补充编码)为十进制,转换很容易,无须转换十六进制到二进制文件,然后在每个位乘以2的幂并总结所有的值来获得结果,这需要太多时间: 数字示例(32位):0xFFFFFE58如何负十六进制转换为十进制

那么我该怎么做呢?

+1

电脑任意数量通常被认为是二进制文件。 – someuser 2014-09-04 11:05:03

+1

我不确定你的小数应该表示什么样的表示。试过'sprintf(缓冲区,“%d”,0xFFFFFE58);'? – 2014-09-04 11:05:04

+0

你怎么能做什么?读取十六进制数字并打印为小数点?请澄清你的问题 – 2014-09-04 11:10:27

回答

3

无需使用电脑就可以这样计算的话:

0xFFFF FE58 = - 0x1A8 = -(1 * 16² + 10 * 16 + 8) = -(256 + 160 + 8) = -424 

0xFFFF FE58是2的补负数。要获得绝对值,必须将所有位反转并将二进制数加1。您还可以减去从第一数目,此数字超出范围(为0x1 0000 0000)

0x100000000 
-0x0FFFFFE58 
     = 
0x0000001A8 

现在我们知道你的电话号码是-0x1A8。现在你必须加上数字乘以他们的位置值。 8 * 16^0 + A(即10)* 16^1 + 1 * 16^2 = 424.所以你的数字的十进制值是-424。

+0

你是怎么做到的? – karim 2014-09-04 12:42:02

+0

我加了一点点。我希望这更清楚。请问什么不清楚。 – mch 2014-09-04 12:56:58

0

做的正数的计算,然后将转换为负二进制补码。

看到这里的解释为正值,从六到小数点:

http://www.permadi.com/tutorial/numHexToDec/

基本上是:

  1. 获取十六进制数字的最右边的数字,称这个数字的currentDigit。
  2. 做一个变量,让我们称之为力量吧。的值设置为0
  3. 乘当前位与(16 ^功率),存储结果。
  4. 递增功率1.
  5. 将currentDigit设置为十六进制数的前一位数。
  6. 重复步骤3直到所有数字相乘。
  7. 总和步骤3的结果得到的答案数量。