[英]Integer arithmetic: Add 1 to UINT_MAX and divide by n without overflow
有没有办法在C中计算((UINT_MAX+1)/x)*x-1
的结果而不求助于unsigned long
(其中x
是unsigned int
)? (根据架构,各自“不使用unsigned long long
”。)
这是一个相当简单的算术:
((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)
对于整数除法,我们有以下等价
(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
。
大多数现代编译器的sizeof(unsigned long)== sizeof(unsigned int)== 4。 您可能希望使用unsigned long long。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.