我给出了8个十六进制数字(例如):
long a0 = 00
long a1 = 2E
long a2 = E8
long a3 = A0
long a4 = 58
long a5 = 0F
long a6 = 37
long a7 = FF
,我想以十进制打印。
所以我尝试了:
long long Decimal = (pow(16, 14) * a) + (pow(16, 12) * a1) + (pow(16, 10) * a2) + (pow(16, 8) * a3) + (pow(16, 6) * a4) + (pow(16, 4) * a5) + (pow(16, 2) * a6) + (pow(16, 0) * a7);
但是我得到一个十进制数字,它不是正确的十进制。对于示例,十进制值为13203624298493951,但我得到13203624298493952。
感谢大家的帮助
答案 0 :(得分:3)
pow
使用浮点运算,并返回double
结果,这会使语句中的其余算术使用double
。 C实现中的double
浮点算法没有足够的精度来准确表示您正在使用的数字。
使用(pow(16, 14) * a0)
,而不要使用(long long) a0 << 4*14
。这使用整数算术,并且只要值不会溢出long long
类型,结果将是准确的。
请注意,如果可以设置a0
的高位(将其视为八位数字),这意味着最终结果将是负数,则(long long) a0 << 4*14
将溢出64位long long
类型。您将需要编写其他代码来处理负数情况。如果希望所有结果都为无符号,而不是负数,请使用unsigned long long
而不是long long
。