有没有办法计算((UINT_MAX+1)/x)*x-1
的结果
在C中而不诉诸unsigned long
(其中x
是unsigned int
)?
(各自"不依赖于unsigned long long
"取决于架构。)
答案 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。