我有三个N位数字,A、B和C。我无法轻松地计算(A + B) % C,但我可以轻松计算A % C和B % C。如果模运算是无符号的,并且我事先知道A + B不会超过N位,则可以计算((A % C) + (B % C)) % C。然而,在模运算为有符号或者A和B的加法可能导致环绕的情况下,是否有什么方法可以解决这些问题呢?
看起来有些混淆的是,为什么((A % C) + (B % C)) % C不能始终可靠地工作。以下是一个无符号示例:
这是一个已签名的示例:
看起来有些混淆的是,为什么((A % C) + (B % C)) % C不能始终可靠地工作。以下是一个无符号示例:
unsigned A = 0x1U;
unsigned B = 0xFFFFFFFFU;
unsigned C = 0x3U;
((A % C) + (B % C)) % C == 0x1U but (A + B) % C == 0x0U
这是一个已签名的示例:
int A = 0x1;
int B = 0xE27F9803;
int C = 0x3U;
((A % C) + (B % C)) % C == 0x1U but (A + B) % C == -2
((A % C) + (B % C)) % C
已经处理了A+B
可能的溢出问题。 - barak manos