在C中设置自己的类型限制?

时间:2018-07-24 14:18:33

标签: c

我可以为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;

是否有更好的方法(不同的算法,使用库等等)?

2 个答案:

答案 0 :(得分:3)

  

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

不,只需编写自己的编译器和库即可。

  

我正在解决一个涉及一些超大型数字的问题,这些数字很容易超出类型的限制

有一些算法可以处理零件中的大量数据……还有一些已经为您完成工作的库,例如看看GNU multi precision arithmetic library (GMP)

答案 1 :(得分:3)

  

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

每个编译器对基本类型的限制是固定的。

  

我希望执行许多加法和乘法运算,并取模数为1537849的最终结果为模数

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

+*pow()的示例代码,具有模数限制:
Modular exponentiation without range restriction

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);