嗨,我想知道如何将十六进制的负值(使用补码编码)转换为十进制,而不必将十六进制转换为二进制,然后乘以2的幂再求和,因为这需要太多时间:
数字示例(32位):0xFFFFFE58
那么我该怎么做?
嗨,我想知道如何将十六进制的负值(使用补码编码)转换为十进制,而不必将十六进制转换为二进制,然后乘以2的幂再求和,因为这需要太多时间:
数字示例(32位):0xFFFFFE58
那么我该怎么做?
不使用计算机,您可以这样计算:
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。
对正数进行计算,然后使用二进制补码转为负数。
在此处查看从十六进制到十进制的正数转换解释:
http://www.permadi.com/tutorial/numHexToDec/
基本上:
sprintf(buffer, "%d", 0xFFFFFE58);
吗? - Sergey L.int d= (int)0xFFFFFE58;
- BLUEPIXY