首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LCG中的int乘法溢出

LCG中的int乘法溢出
EN

Stack Overflow用户
提问于 2013-06-21 02:55:42
回答 1查看 400关注 0票数 2

下面是从一个开放源码项目的rand()复制的,它使用LCG

代码语言:javascript
复制
rand_next = rand_next * 1103515245L + 12345L;  //unsigned long rand_next

经典的LCG是:

Next = (Next *a+ c)

很明显,这里M是2^32。

让我困惑的是rand_next * 1103515245L,我很确定会发生溢出!我看了几个rand()实现,除了使用不同的a和c之外,都采用这种方式。

溢出有害吗?如果不是为什么?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2013-06-21 03:09:15

signed longunsigned long相乘。因此,*的两个操作数具有相同的整数转换秩。在这种情况下,适用以下规则(C++11,第5 /9节,第5项,第3项):

..。如果具有无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则具有符号整数类型的操作数将转换为无符号整数类型的操作数类型。

因此,在计算乘法之前,这两个操作数都被隐式转换为unsigned long。因此,您将得到无符号算术和无符号结果,并且同样的规则同样适用于加法操作。

对于无符号的整数溢出是很好的定义(请参阅宗镇丽的答案,它已经被详细地扩展了),所以没有问题。

关于C(相对于C++),C11在第6.3.1.8/1节中有一条相同的规则:

..。如果具有无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则带符号整数类型的操作数转换为无符号整数类型的操作数类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17226998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档