我已经给出了 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。
谢谢大家的帮助
最佳答案
pow
使用浮点运算并返回 double
结果,这会导致语句中的其余算术使用 double
. double
C 实现中的浮点运算没有足够的精度来准确表示您正在使用的数字。
而不是使用 (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
.
关于c - 为什么我的程序打印出错误的十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56377950/