c - 为什么我的程序打印出错误的十进制数

标签 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。

谢谢大家的帮助

最佳答案

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/

相关文章:

C:使用具有 "getter"函数和中断的静态 volatile

c - 具有内在函数和汇编的嵌入式广播

使用标准 char 数据类型而不是 wchar_t 的 C 西里尔控制台输入

c - 编辑和删除记录的调试断言失败

IN6ADDR_ANY_INIT 可以自动绑定(bind)到链接本地地址吗?

c - 当进程在 waitpid 中等待时如何处理信号?

c - Berkeley DB 读取数据失败

c - C字符串和C++字符串有什么区别?

c - 如何处理 open() 返回 1

c - glibc 中的暂存缓冲区是什么意思?