【问题标题】:What are the possible values after int32 overflow?int32 溢出后可能的值是多少?
【发布时间】:2013-11-30 18:40:24
【问题描述】:

我有一个函数,它接受一个字符串作为输入,然后将加权值的乘积分配给一个变量,方式如下:字母表中的每个字母对应一个 2 到 101 之间的质数,而值为输入字符串中的每个字符都相乘并存储在一个 int 变量中,如下所示:

int result=1;
/* some other code */
result*=letterweight[index];

有足够长的字符串会导致溢出。那么,我的问题如下:

在给定结果的情况下,我如何确定可能正确的值?

例如:如果result == 1066849907,忽略C中int的取值范围,还有什么其他的值?

我无法控制原始代码,也无法确定是否发生了溢出。我只对找出一系列可能的结果感兴趣,不管数字有多大。

【问题讨论】:

  • 有符号整数溢出是未定义的行为,你不能依赖任何东西。

标签: c++ c algorithm


【解决方案1】:

有符号整数溢出(在 C 和 C++ 中)会导致未定义的行为,因此您无法以这种方式推理您的代码。您只能测试您的特定编译器/版本并查看它产生的结果。

但是,这是一种可怕的代码编写方式,将来会咬你一口。您的建议不是解决方案。如何对数据进行预处理并删除会导致溢出的值?

【讨论】:

    【解决方案2】:

    有符号整数溢出 - 与无符号整数溢出不同 - 在 C 和 C++ 中是未定义的行为 (see this response)。

    但是,如果您进行算术 unsigned int,则标准保证模 2 算术,换句话说,对于任何 a,可能的 实数 值的范围是 result + 2^(sizeof(unsigned int) * 8) * a

    【讨论】:

    • 这个答案中描述的集合不是可能值的集合;它包括一些不可能的。正如杜克林所指出的,任何质因数大于 101 的数字都是不可能的。 (此外,乘数应该是 CHAR_BIT 而不是 8。)
    • 您引用的可能值范围不正确:不能保证char 使用8 位。正确的上限是 std::numeric_limits<unsigned int>::max(),它是 2 的幂。
    猜你喜欢
    • 2010-09-10
    • 2022-01-25
    • 2021-08-06
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2017-07-02
    • 2021-07-01
    相关资源
    最近更新 更多