c - 如何确保模数为正值

标签 c

给定这个简单的随机生成器:

int i, r = 0;
for (i = 0; i < 50; i++) {
    r = (1234 * r + 101) % (11000000);
    printf("%d\n", r);
}

令人惊讶的是,我得到负值!

101
124735
10923091
192507
6553739
-7620565
-10842517
-10763989
-1860437
8188139

不应该是正值吗?谁能解释一下?

最佳答案

你得到负值是因为你的程序有整数算术溢出。对于签名类型 int,该行为实际上是未定义的。您应该使用更大的类型来避免这种情况。 unsigned long long 类型保证至少有 64 个值位,这足以满足最大中间结果 1234 * 10999999 + 101

int i;
unsigned long long r = 0;
for (i = 0; i < 50; i++) {
    r = (1234 * r + 101) % 11000000;
    printf("%llu\n", r);
}

rici 评论说 r 不需要是更大的类型,因为它的值在 0..10999999 范围内。这并不完全正确,因为 int 类型可能太小而无法处理此类值。 int 的范围可以小到 -32767..32767

然而,中间计算必须使用更大的类型来执行,以避免算术溢出。下面是相应的代码:

int i, r = 0;  // assuming 32-bit ints
for (i = 0; i < 50; i++) {
    r = (1234ULL * r + 101) % 11000000;
    printf("%d\n", r);
}

关于c - 如何确保模数为正值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44874403/

相关文章:

c - Perl 结构流向 C

根据 K&R,无法理解 C 中 getint() 的工作

c++ - libbpg-如何传递字节而不是文件路径

c - 插入(不覆盖)到 C 中的文件

c - 递归函数到迭代,该函数给定 g(n) = 2*g(n-1)+3*g(n-2)

c - 3D 矩阵求和 cuda

c - Linux - rtnetlink RTM_GETLINK - 处理和理解回答的数据

c - 使用 libpcap 读取纳秒 pcap 文件

objective-c - Objective C bool 属性和内存

在低级文件复制程序中使用 Gotoxy() 时生成代码错误