2011-12-23 41 views
6

我注意到对C++ 11的5.6节的一些措辞更改。 (我在看2011年2月28日的C++标准草案N3242。)新的(草案)标准包含以下句子:C++中的整数部分11

“对于整型操作数,运算符产生的代数商与任何小数部分丢弃;”

该声明不在03标准(ISO-IEC-14882-2003)的5.6中,但我不认为这是一个变化,是吗?这是C和C++多年来的工作方式,除非我已经失去了主意(无论如何可能发生了这种情况)。

回答

9

你不会生气。

甲脚注5.6/4说:

[C++03 footnote 74]:根据朝向修订ISO C的 工作正在进行中,整数除法的优选算法遵循在ISO Fortran标准,ISO/IEC 1539定义的 规则:1991年,其中 的商总是趋于零。

在C++ 11中,此行为是明确要求的,而不是“首选”;的变化列在兼容性部分:

[C++11: C.2.2]:
变化:指定舍入为整数/%
理由的结果:增加的便携性,C99的兼容性。
对原始特征:有效C++使用整数除法 回合的结果朝向0或向负无穷大2003代码,而这 国际标准总是舍入0朝向

1

几乎结果。在C++ 03中,%(这两个术语都是指定的)的余数的符号没有指定,因为在某些情况下,这样的舍入也可能从零开始。与C++ 03脚注比较:

根据工作朝向ISO C的修订进行,优选的 算法整数除法遵循在ISO Fortran标准,ISO/IEC 1539定义的规则:1991 ,其中商总是 四舍五入到零。

实际上,这几乎从来没有任何区别。

+0

这将使我的代码有很大的不同。这是否意味着'%'结果的符号现在也被定义了? – ThomasMcLeod 2011-12-23 15:00:58

+1

@ThomasMcLeod:是的,整个'/'/'%'事物现在被定义为在任何地方表现相同。你确定它在你的代码中有所作为吗?你的实现是少数尚未截断的实现之一吗? – PlasmaHH 2011-12-23 15:08:22

+1

至少有两种解释模数算子的方法。更常见的方式就是分工的其余部分。在这种情况下,结果的符号与商的符号相同。例如'-5%-4 == 1 && -5%4 == -1'。另一种方法是代数方式,mod运算符返回操作数的同余类。在这种情况下,当且仅当'm'除('b-a)'时,'a%m == b''被定义为'm'为正。这里。 'b'是一个严格小于'm'的非负数,所以'-5%4 == 3'。 – ThomasMcLeod 2011-12-25 17:28:22