我有一个代码,用于根据使用输入将十进制数转换为十六进制数。但是,当打印结果时,数字的唯一部分将转换为十六进制,并且数组中还有其他随机值。
例如: decimal = 1234567891012 ---- hexa = 00 00 00 02 00 00 00 65 00 6b 42 48 71 fb 08 44
最后四个vales(71 FB 08 44
)是正确的十六进制值,但其他值不正确
我正在使用uint8_t buf [];
代码:
int main()
{
uint8_t buf[] = {0};
long int i,a;
printf("Enter Number: ");
scanf("%d", &buf);
printf("\n");
printf("Input #: ");
/* put a test vector */
for (i = 15; i >= 0; i--)
{
printf("%02x ", buf[i]);
}
printf("\n\n");
printf("\n\n");
printf("%d\n",sizeof(buf));
system("pause");
return 0;
}
答案 0 :(得分:1)
免责声明:由于您没有提供源代码,我将假设一些事项:
发生这种情况是因为您使用unsigned int
来存储小数,这只是您计算机上的32位。使用unsigned long
存储大的小数。
unsigned long decimal = 12345678901012L;
对于16字节小数,请使用GMP Lib。
---编辑---
您必须使用scanf("%lu", &decimal)
存储为长小数。 scanf(“%d”,& decimal)仅复制“整数(带符号)”,可能是您机器上的32位!
答案 1 :(得分:0)
发布代码后问题变得更加明显:
首先:
uint8_t buf[] = {0};
不好。您需要为数组指定一个大小(或使其动态化),这就是您在访问元素时获得“垃圾”的原因。现在,我们可以给它任意大小:
uint8_t buf[100] = {0};
修复了“垃圾”值问题。
第二个问题是您的扫描是否期望正常的int
大小的值:"%d"
您需要告诉它以寻找更大的值,例如:
scanf("%llu", &buf[0]);
但是,您应该针对limits验证您的输入。确保用户输入的内容在LONG_MAX或INT_MAX范围内或您拥有的任何类型。