Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
设置一个';在C中有自己的类型限制吗?_C - Fatal编程技术网

设置一个';在C中有自己的类型限制吗?

设置一个';在C中有自己的类型限制吗?,c,C,我可以为C中的数据类型设置自己的限制吗?我正在解决一个问题,这个问题涉及到一些非常大的数字,我希望执行许多加法和乘法,并将最终结果模化为一些期望的数字,比如1537849。因此,我想知道是否有可能重置数据类型的限制,这样当任何操作的结果超过我指定的数字时,值会自动按我希望的数字取模,就像处理器通常所做的那样,但符合我希望的限制。如果这样的事情是不可能的,那么协商这样一个问题最有效的方式是什么 编辑: 假设有人想计算(2^1000)%1537849,并将结果放入变量monster中。下面是我试图解

我可以为C中的数据类型设置自己的限制吗?我正在解决一个问题,这个问题涉及到一些非常大的数字,我希望执行许多加法和乘法,并将最终结果模化为一些期望的数字,比如1537849。因此,我想知道是否有可能重置数据类型的限制,这样当任何操作的结果超过我指定的数字时,值会自动按我希望的数字取模,就像处理器通常所做的那样,但符合我希望的限制。如果这样的事情是不可能的,那么协商这样一个问题最有效的方式是什么

编辑:

假设有人想计算(2^1000)%1537849,并将结果放入变量
monster
中。下面是我试图解决这个问题的方法:

uint64_t monster = 1;
uint32_t power = 1000;
for (uint32_t i = 0; i < power; i ++ ) {
    monster *= 2;
    if (i%64==63) monster %= 1537849;
}
monster %= 1537849;
uint64\u t monster=1;
uint32_t功率=1000;
对于(uint32_t i=0;i
有没有更好的方法(不同的算法、使用库等等)

我可以为C中的数据类型设置自己的限制吗

不,除了编写自己的编译器和库之外

我正在解决一个问题,这个问题涉及到一些非常大的数字,它们很容易超过类型的限制

有一些算法可以处理部分中的大量数据。。。还有一些图书馆已经为你做了这项工作,比如看一下

我可以为C中的数据类型设置自己的限制吗

不,除了编写自己的编译器和库之外

我正在解决一个问题,这个问题涉及到一些非常大的数字,它们很容易超过类型的限制

有一些算法可以处理部分中的大量数据。。。还有一些图书馆已经为你做了这项工作,比如看一下

我可以为C中的数据类型设置自己的限制吗

基本类型的限制是由编译器确定的

我希望执行许多加法和乘法,并将最终结果模化为某个所需的数字,例如1537849

在加法和乘法的任何阶段,代码都可以重复执行模运算。如果原始数字是N位的,则最多需要N位数学-尽管使用2N位数学更容易。无限宽的数学计算效率低下,不需要执行此任务

具有模限制的
+
*
pow()
示例代码:

我可以为C中的数据类型设置自己的限制吗

基本类型的限制是由编译器确定的

我希望执行许多加法和乘法,并将最终结果模化为某个所需的数字,例如1537849

在加法和乘法的任何阶段,代码都可以重复执行模运算。如果原始数字是N位的,则最多需要N位数学-尽管使用2N位数学更容易。无限宽的数学计算效率低下,不需要执行此任务

具有模限制的
+
*
pow()
示例代码:


简言之:不。但这是一个:你认为你想要设置一些现有类型的限制,你真正想要的是一个bignum库。你必须使用或编写大数字的代码。对于较小的数字,您可以使用位域或位掩码。@davmac:许多人询问用大数求余数的问题,他们正在研究一些挑战性的问题,他们真正需要的不是大数库,而是思考基本算术是如何工作的以及他们如何使用它。@EricPostChil,这是一个XY问题。重点是,询问你的目标,而不是如何实现一个潜在的解决方案,该解决方案(a)可能不可能或不实用,(b)可能不是解决问题的最简单/最佳解决方案。通过询问特定的解决方案,您可能会错过好的有用信息。幸运的是,在本例中,OP进行了详细阐述,以便我们能够认识到这是一个XY问题。@AhmedMagdy有点不清楚的是,“我正在解决一个涉及一些特大数字的问题”,但所有示例都是从小数字开始的,如:1537849、2、1000、1、64、63。对于计算机来说,这些不是“大”数字。所需功能的结果也很小,因为完成所有操作后,“某物mod 1537849”将在[0…1537848]范围内。像
2^1000
这样的数字是从起始数字派生出来的。要点:为了得到结果,代码不需要计算
2^1000
。因此,如果所有起始数字都符合
uint64\t
,则不需要“大数”。简言之:不需要。但这是一个:如果您认为要设置某些现有类型的限制,您真正需要的是一个大数库。您必须为大数使用或编写代码。对于较小的数字,您可以使用位域或位掩码。@davmac:许多人询问用大数求余数的问题,他们正在研究一些挑战性的问题,他们真正需要的不是大数库,而是思考基本算术是如何工作的以及他们如何使用它。@EricPostChil,这是一个XY问题。重点是,询问你的目标,而不是如何实现一个潜在的解决方案,该解决方案(a)可能不可能或不实用,(b)可能不是解决问题的最简单/最佳解决方案。通过询问特定的解决方案,您可能会错过好的有用信息。幸运的是,在本例中,OP进行了详细阐述,以便我们能够认识到这是一个XY问题。@AhmedMagdy有点不清楚的是,“我正在解决一个涉及一些特大数字的问题”,但所有示例都是从小数字开始的,如:1537849、2、1000、1、64、63。对于计算机来说,这些不是“大”数字。所需功能的结果也很小,因为完成所有操作后,“某物mod 1537849”将在[0…1537848]范围内。像
2^1000
这样的数字是从您的起始n派生的
uintmax_t addmodmax(uintmax_t a, uintmax_t b, uintmax_t mod);
uintmax_t mulmodmax(uintmax_t a, uintmax_t b, uintmax_t mod);
uintmax_t powmodmax(uintmax_t x, uintmax_t expo, uintmax_t mod);