为什么我的程序打印错误的十进制数字

时间:2019-05-30 12:02:15

标签: c

我给出了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。

感谢大家的帮助

1 个答案:

答案 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