将单个 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
。查看 writeNumber
为 numberLength-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),因此它也不理想。最好坚持使用纯整数运算以避免这些陷阱。
我正在尝试获取一个 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
。查看 writeNumber
为 numberLength-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),因此它也不理想。最好坚持使用纯整数运算以避免这些陷阱。