当前位置:  开发笔记 > 编程语言 > 正文

整数除法在C++中用负数舍入

如何解决《整数除法在C++中用负数舍入》经验,为你挑选了3个好方法。

假设a并且b都是类型int,并且b非零.考虑a/b在以下情况下执行的结果:

    a并且b都是非负的.

    a并且b都是消极的.

    其中只有一个是消极的.

在案例1中,结果向下舍入到最接近的整数.但标准对案例2和案例3有什么看法?我发现在互联网上浮动的旧草案表明它是依赖于实现的(是的,甚至是案例2),但委员会倾向于使其始终"向零舍入".有谁知道(最新)标准说的是什么?请仅根据标准回答,而不是有意义的回答,或者特定的编译器做什么.



1> Stefan Mai..:

根据2008年5月的修订,

你是对的:

二元/运算符产生商,二元%运算符从第一个表达式除以第二个表达式得到余数.如果/或%的第二个操作数为零,则行为未定义; 否则(a/b)*b + a%b等于a.如果两个操作数都是非负的,那么余数是非负的; 如果没有,余数的符号是​​实现定义的75).

注75说:

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

在这方面,C++可能会落后于C语言.目前看来,它尚未定义,但他们着眼于改变它.

我和Stroustrup以及委员会成员在同一个部门工作.事情需要时间才能完成,而其无休止的政治.如果它看起来很傻,那可能就是.


引用的陈述是陈旧的.它可以追溯到C++ 98标准,并参考C99修订版.C99指定舍入为零,C++ 11也适用.

2> Sjoerd..:

作为其他答案的更新:

C++ 11的最后一个草案,n3242,其实际用途与实际的C++ 11标准相同,在5.6分4(第118页)中说明了这一点:

对于积分操作数,/运算符产生代数商,丢弃任何小数部分; (见注80)

注意80个州(注意注释是非规范性的):

80)这通常被称为截断为零.

第4点继续说明:

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

可以证明要求a%b符号与a(当不为零时)的符号相同.



3> Federico A. ..:

只是评论.当前C++标准的工作草案确实纠正了"实现定义"问题,并要求截断为零.这是委员会的网页,这是草案.问题出在第112页.

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有