Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 单个长数到int数组的错误传输_Arrays_C_Modulo_Long Long - Fatal编程技术网

Arrays 单个长数到int数组的错误传输

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,并将每个位置编号拆分为一个数组中它自己的位置,当然,按顺序,数组[0]是最大的数字

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

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

问题是,它需要能够处理非常大的数字(9999999999+),而我正在制作关于大数据的戏剧。如果Long-Long小于1000000,它将完美地写入所有数字,但我添加的数字越多,它们在接近结尾时都开始写入错误

例如,1234567890显示为1234567966

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

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;