【问题标题】:Integer Division in C++11C++11 中的整数除法
【发布时间】:2011-12-23 14:10:08
【问题描述】:

我注意到 C++11 的 5.6 节有一些措辞变化。 (我正在查看 C++ 标准草案 N3242,日期为 2011-02-28。)新的(草案)标准包括以下句子:

"对于整数操作数, / 运算符产生代数商,并丢弃任何小数部分;"

03 标准 (ISO-IEC-14882-2003) 的 5.6 中没有这个声明,但我不认为这是一个变化,是吗?这就是 C 和 C++ 多年来的工作方式,除非我失去理智(无论如何都可能发生)。

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    你不会发疯的。

    5.6/4 的脚注说:

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

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

    [C++11: C.2.2]:
    更改: 为整数 /% 的结果指定舍入
    理由: 提高可移植性和 C99 兼容性。对原始功能的影响: 使用整数除法的有效 C++ 2003 代码 将结果向 0 或负无穷大舍入,而这 国际标准总是将结果四舍五入到 0。

    【讨论】:

      【解决方案2】:

      几乎。在 C++03 中,未指定 % 的余数符号(其中指定了两个术语),因为在某些情况下,这种舍入也可能远离零。与 C++03 脚注比较:

      根据正在进行的 ISO C 修订工作,首选 整数除法算法遵循 ISO 中定义的规则 Fortran 标准 ISO/IEC 1539:1991,其中商始终为 向零舍入。

      然而,在实践中,这几乎没有任何区别。

      【讨论】:

      • 这将使我的代码大不相同。这是否意味着%的结果的符号现在也定义了?
      • @ThomasMcLeod:是的,整个//% 现在被定义为在任何地方都表现相同。你确定它对你的代码有影响吗?您的实现是少数尚未截断的实现之一吗?
      • 至少有两种解释模运算符的方法。更常见的方法是简单的除法余数。在这种情况下,结果的符号与商的符号相同。例如,-5 % -4 == 1 && -5 % 4 == -1。另一种方式是代数方式,其中 mod 运算符返回操作数的同余类。在这种情况下,a % m == b 当且仅当m 除以(b - a) 并且定义为m 为正数。这里。 b 是严格小于 m 的非负数,因此 -5 % 4 == 3
      猜你喜欢
      • 1970-01-01
      • 2018-10-11
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 2013-07-17
      • 2012-12-31
      相关资源
      最近更新 更多