将单个 long long 数字转移到 int 数组的错误

Buggy transfer of single long long numbers to int array

我正在尝试获取一个 Long Long Int 并将每个位号拆分到数组中它自己的位置,当然是按顺序排列,数组 [0] 是最大的数字。

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

这是微控制器计算器项目的一部分,我正在其中编写图形库(为了好玩)并使用数组显示每一行。

问题是,它需要能够处理非常大的数字(9,999,999,999+),而我正在处理大量数据。如果Long Long < 1,000,000,它会完美地写出所有数字,但是我添加的数字越多,到最后它们都开始写错了。

例如,1,234,567,890 显示为 1,234,567,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 范围内的任何数字都可以完美工作。

你能看出我错在哪里吗?有没有更好的方法来实现我的目标?有大量的提示吗?

您的问题是您将可能非常大的数字转换为 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;
}

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),因此它也不理想。最好坚持使用纯整数运算以避免这些陷阱。