单长长整型的Buggy传输到int数组

问题描述

我正在尝试获取Long Long Int,并按照顺序将每个地名按顺序分成数组中自己的位置,其中array [0]是最大数字。

例如,如果数字为314,则array [0] = 3,array [1] = 1,array [2] = 4。

这是一个微控制器计算器项目的一部分,我在其中编写图形库(出于娱乐目的)并使用数组显示每一行。

问题是,它需要能够处理非常大的数字(9,999,999+),而我正在处理具有大数目的戏剧。如果Long Long

例如,1,234,567,890显示为1,966。

以下是我正在使用的代码段:

long long int number = 1234567890;
int answerArray[10];
int numberLength = 10;

for(writeNumber = 0; writeNumber < numberLength; writeNumber++)
{
    answerArray[writeNumber] = ((int)(number / pow(10,(numberLength - 1 - writeNumber))) % 10;
}

我非常确定这与“%”和多种数据类型有关,因为Int范围内的任何数字都可以正常工作。

可以看到我要去哪里了吗?有没有更好的方法可以实现我的目标?有大量提示吗?

解决方法

pow的签名是

double pow(double x,double y);

调用函数时,计算将隐式使用浮点数。这就是为什么它不再像纯整数运算那样精确。

此外,您还必须小心转换为int

您有问题

((int)(number / pow(10,(numberLength - 1 - writeNumber))) % 10;

括号不匹配,所以我假设你的意思是

(int)(number / pow(10,(numberLength - 1 - writeNumber))) % 10;

但是,在这里您应用模10运算之前,会强制转换一个可能超出int范围的数字。这会导致整数溢出。该代码与您编写的代码一样:

((int)(number / pow(10,(numberLength - 1 - writeNumber)))) % 10;

为避免溢出,最好先执行模运算。但是,此时您正在隐式处理double(由于pow),因此也不理想。最好坚持使用纯整数运算以避免这些陷阱。

,

您的问题是,您正在将可能非常大的数字投射到int中。查看writeNumbernumberLength-1时的迭代。在这种情况下,您要将long long除以1,然后将结果强制为int。一旦number变得大于2 ^ 31-1,您就会遇到问题。

您应该完全删除强制类型转换以及对pow的调用。取而代之的是,您应该迭代修改下一个数字,方法是将其除以10,然后将number(或其副本)除以10。

例如

int index = sizeof(answerArray)/sizeof(answerArray[0]);
for (long long x=number; x>0; x /= 10) {
    answerArray[--index] = x%10;
}