Arrays 单个长数到int数组的错误传输
我试图获取一个Long-Long Int,并将每个位置编号拆分为一个数组中它自己的位置,当然,按顺序,数组[0]是最大的数字 例如,如果数字是314,那么数组[0]=3,数组[1]=1,数组[2]=4 这是微控制器计算器项目的一部分,我正在编写图形库(为了好玩)并使用数组显示每一行 问题是,它需要能够处理非常大的数字(9999999999+),而我正在制作关于大数据的戏剧。如果Long-Long小于1000000,它将完美地写入所有数字,但我添加的数字越多,它们在接近结尾时都开始写入错误 例如,1234567890显示为1234567966 下面是我正在使用的代码片段:Arrays 单个长数到int数组的错误传输,arrays,c,modulo,long-long,Arrays,C,Modulo,Long Long,我试图获取一个Long-Long Int,并将每个位置编号拆分为一个数组中它自己的位置,当然,按顺序,数组[0]是最大的数字 例如,如果数字是314,那么数组[0]=3,数组[1]=1,数组[2]=4 这是微控制器计算器项目的一部分,我正在编写图形库(为了好玩)并使用数组显示每一行 问题是,它需要能够处理非常大的数字(9999999999+),而我正在制作关于大数据的戏剧。如果Long-Long小于1000000,它将完美地写入所有数字,但我添加的数字越多,它们在接近结尾时都开始写入错误 例如,
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;
}
long int number=1234567890;
int-answerArray[10];
整数长度=10;
对于(WriteEnumber=0;WriteEnumber
我相当肯定这与“%”和多种数据类型有关,因为Int范围内的任何数字都可以完美工作
你能看出我的错误在哪里吗?有没有更好的方法来实现我的目标?关于大数有什么建议吗?你的问题是你正在将一个可能非常大的数转换成一个
int
。当writeNumber
为numberLength-1
时,看看迭代。在这种情况下,你正在分割一个long-longe> 然后将结果强制为int
。一旦number
大于2^31-1,您将遇到问题
您应该完全删除强制转换以及对pow
的调用。相反,您应该迭代地获取下一个数字,方法是将modding out除以10,然后将number
(或其副本)除以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;
为了避免溢出,最好先执行模运算,因此也不理想。最好坚持使用纯整数运算以避免这些陷阱。pow
用于浮点求幂;使用long
参数将失去精度,并且浮点不是要在微控制器上使用的。通常,您会将其重写为vide和mod改为10。@NateEldredge我不知道,所以你认为一次只做10次?是的,如果你从右到左填充数组会更容易。sizeof(answerArray)
应该是元素的数目,sizeof answerArray/sizeof*answerArray
。谢谢!修改长整型int仍然可以,因为它是一个整数?确实可以。只要它是非负的。对于负操作数,%
可以产生负结果。
((int)(number / pow(10, (numberLength - 1 - writeNumber)))) % 10;