2012-09-02 61 views
11

对于int a, b,我知道当ab中只有一个是负数时,a/ba % b的结果是机器相关的。但是当b不为零时,我总是有(a/b * b) + a % b == a吗?当b不是零时,我总是有`(a/b * b)+ a%b == a`吗?

+0

什么意思是“总有”,什么类型是a和b –

+0

事实上,如果类型是无符号类型,当“b”非零时相等总是成立。 –

回答

18

C++ 11§5.6[expr.mul/4规定了:

如果商a/b是结果的类型表示的,(a/b)*b + a%b等于a

C11§6.5.5/ 6指定具有稍微不同的措辞是相同的:

如果商a/b可表示,表达(a/b)*b + a%b应等于a;否则,a/ba%b的行为未定义。

+2

请注意,“如果商是可表示的”子句是必不可少的。例如,如果'a == INT_MIN'和'b == - 1',等于false(并且行为是未定义的)。 –

+0

@R .. - 对于二进制补码表示而言,这是正确的,但对符号幅度不适用。不确定补码。这三个都是C和C++的有效整数表示。 –

+0

对不起,我的意思是一般都是错误的,因为二进制补码是一种可能性。这在实践中也是错误的,因为补充和签署/量级实现不存在。 –

相关问题