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

时间:2015-03-21 11:12:52

标签: c integer-overflow integer-division

有没有办法计算((UINT_MAX+1)/x)*x-1的结果 在C中而不诉诸unsigned long(其中xunsigned int)? (各自"不依赖于unsigned long long"取决于架构。)

3 个答案:

答案 0 :(得分:4)

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

((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)

答案 1 :(得分:1)

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

(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计算。

答案 2 :(得分:-2)

在大多数现代编译器上,

sizeof(unsigned long)== sizeof(unsigned int)== 4。您可能希望使用unsigned long long。