c - 如何在模运算之前键入 uint32 数组的强制转换元素?

标签 c arrays casting modulo

我被迫将输出存储在 unsigned int 数组中。但是,输出是数组 modulo 2147483647 中先前元素的线性组合的解,即 modulo 2^31-1。

下面是一个更大函数的代码片段。很快,这个片段会产生错误的答案,因为 ii 环绕着 xx 的索引。 (请注意,xx 在调用函数之前进行播种,因此数组中的元素都不是空的。)

#include <stdint.h>
typedef unsigned int uint32;
typedef unit_least64_t uint64;
static uint32 xx[47];

...

xx[ii] = 12345 * (uint64)(xx[i0] + xx[ii]) % 2147483647;  // i0, ii are defined elsewhere

但是,如果我们将最后一行与以下内容交换,我们将不断得到正确的解决方案。

xx[ii] = 12345 * ( (uint64)xx[i0] + (uint64)xx[ii] ) % 2147483647;

也许,这很明显,但为什么需要对 unit64 进行两次类型转换而不是一次?

最佳答案

一个类型转换就足够了,只要你把它放在正确的地方:

xx[ii] = 12345 * ( (uint64)xx[i0] + xx[ii] ) % 2147483647;

重要的是在加法之前进行转换以防止数字溢出,而不是在它之后,当溢出已经发生时。

关于c - 如何在模运算之前键入 uint32 数组的强制转换元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19394467/

相关文章:

c - 使用头文件 C 中定义的结构

python - numpy 开始、精确、收敛结束

javascript - 在这个二维数组中找到最大的区域

javascript - react JSX : Access props keys dynamically

c++ - 将对象转换为 char* 以保存/加载

android - LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, 这个);尝试转换为 com.google.android.gms.location.LocationListener)

C 指针 - 指向同一地址

c - 结构填充和包装

sql-server - 无论登录日期格式如何,都将 nvarchar 转换为日期时间?

c - fwrite可移植性