【问题标题】:C Programming - using modulo of a sum of unsigned integers which overflowsC编程 - 使用溢出的无符号整数和的模
【发布时间】:2016-12-06 22:18:39
【问题描述】:

我在大学有一个任务,我需要为给定的主程序编写函数。 一切都在c中。

所以,我的问题是我需要使用两个无符号整数之和的模块。

uint32_t mod_add(uint32_t x, uint32_t y, uint32_t n)
{
    uint32_t res;

    res = (x + y) % n;

当 x 和 y 之和低于 2^32-1 时,这很好用。 我的麻烦是当总和超过这个值时,它显然溢出并且模值是错误的。

在我的作业中 x = 2^32-3; y =1174501 和 n =2^32-1(n 是模数); 我的结果是1174497,应该是1174499。

任何人有任何想法,如何解决这个问题?

【问题讨论】:

  • 尝试res=((uint64_t)x+y)%n; 代替。
  • 是的....不允许使用64位...这就是问题所在。

标签: c overflow modulo unsigned-integer


【解决方案1】:

你来了。

uint32_t remainder(uint32_t x, uint32_t y, uint32_t d)
{
    uint32_t r1 = x % d;
    uint32_t r2 = y % d;

    return r1 < (d - r2) ? r1 + r2 : r1 - (d - r2);
}

当然,您可以使用任何整数类型来代替uint32_t,例如unsigned long long

【讨论】:

  • 也许(r1 + r2) &lt; d ? r1 + r2 : (r1 + r2) - d 会更具可读性。还是不错的答案。
  • @izlin r1 + r2 会导致溢出。因此,您将处理相同的原始问题。
  • @Vlad,如果任务现在是 (x-y)%d,会发生什么?
  • @DavidHenkel 只需从较大的值中减去较小的值。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 2013-04-10
  • 2014-12-09
  • 2012-02-29
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多