如何将负十六进制数转换为十进制数

7

嗨,我想知道如何将十六进制的负值(使用补码编码)转换为十进制,而不必将十六进制转换为二进制,然后乘以2的幂再求和,因为这需要太多时间:

数字示例(32位):0xFFFFFE58

那么我该怎么做?


1
计算机通常将任何数字视为二进制。 - someuser
1
我不确定你的十进制数应该采用什么表示法。尝试过使用sprintf(buffer, "%d", 0xFFFFFE58);吗? - Sergey L.
你如何做到什么?读取十六进制数并将其打印为十进制?请澄清你的问题。 - Tom Tanner
我想把一个十六进制数转换成十进制数,但不使用计算机。 - KarimS
1
int d= (int)0xFFFFFE58; - BLUEPIXY
2个回答

6

不使用计算机,您可以这样计算:

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。


我添加了一点内容。希望这样更清楚了。如果有不清楚的地方,请随时提问。 - mch

0

对正数进行计算,然后使用二进制补码转为负数。

在此处查看从十六进制到十进制的正数转换解释:

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

基本上:

  1. 获取十六进制数的最右边的数字,将该数字称为当前数字。
  2. 创建一个变量,我们称之为power。将其值设置为0。
  3. 将当前数字乘以(16^power),并存储结果。
  4. 将power增加1。
  5. 将当前数字设置为十六进制数的前一个数字。
  6. 从步骤3开始重复,直到所有数字都被乘。
  7. 将步骤3的结果相加以得到答案数字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接