代码之家  ›  专栏  ›  技术社区  ›  mschauer

整数算术:将1添加到UINT_MAX并除以n而不溢出

  •  1
  • mschauer  · 技术社区  · 10 年前

    有没有方法计算 ((UINT_MAX+1)/x)*x-1 在C中,无需诉诸 unsigned long (其中 x unsigned int )? (各自) unsigned long long “取决于体系结构。)

    3 回复  |  直到 10 年前
        1
  •  4
  •   vharavy    10 年前

    这是一个相当简单的算术:

    ((UINT_MAX + 1) / x) * x - 1 =
    ((UINT_MAX - x + x + 1) / x) * x - 1 = 
    ((UINT_MAX - x + 1) / x + 1) * x - 1 =
    (UINT_MAX - x + 1) / x) * x + (x - 1)
    
        2
  •  1
  •   chmike    10 年前

    对于整数除法,我们具有以下等价性

    (y/x)*x == y - y%x
    

    所以我们有

    ((UINT_MAX+1)/x)*x-1 == UINT_MAX - (UINT_MAX+1)%x
    

    将此结果与以下等效结果相结合

    (UINT_MAX+1)%x == ((UINT_MAX % x) +1)%x
    

    我们得到

    ((UINT_MAX+1)/x)*x-1 == UINT_MAX - ((UINT_MAX % x) +1)%x
    

    它可以用 unsigned int .

        3
  •  -2
  •   wik146    10 年前

    在大多数现代编译器中,sizeof(unsigned long)==sizeof(无符号int)==4。您可能希望使用无符号long-long。