题
假设 a
和 b
都是这两个类型的 int
, , b
非零。审议结果的执行 a/b
在下列情况下:
a
和b
都非负。a
和b
都是负面的。- 正是他们中的一个是负面的。
在情况1的结果是四舍五入至最接近的整数。但什么是标准说,有关案例2和3的?一个老草案,我发现了漂浮在互联网上表示,它是实现相关的(是的,甚至种情况下2)但是委员会倾向于使它总是'轮朝零。' 任何人都不会知道什么是(最新的)标准所说的吗?请回答只有根据的标准,不是什么有意义的,或者什么特别的编译器做。
解决方案
根据可2008年订正本,
你是对的:
二进制/经营者产商和二%操作人员产量的其余部分从该司的第一次表达的第二个。如果第二个操作数的/或%为零的行为是不确定;否则(a/b)*b+的等于一个.如果两个操作数都是非负然后剩余的非负;如果不是,签署的其余部分是实现defined75).
注75中说:
根据工作正在进行的朝修订的ISO C佳算法,对整数分下定义的规则的ISO Fortran标准、ISO/IEC1539:1991年,在其商总是圆朝零。
机会是用C++将滞C在这一方面。因为它的立场,这是不确定但他们有一个着眼于改变它。
我工作在同一部门作为Stroustrup和与委员会成员。事情取得的成就,及其无休止的政治性。如果它似乎是愚蠢的,它可能是。
其他提示
作为一个更新的其他的答案:
最后草案C++11 n3242 这是最实际的目的等同于实际C++11标准,说这5.6点4(第118页):
为整体的操作数的/操作员的产量的代数商 与任何部分丢弃;(见注80)
注意到80个国家(注意,注意到非规范性):
80),这是通常被称为截断对零。
4点在的状态:
如果商a/b表现的种类型的结果, (a/b)*b+的等于一个.
它可以显示需要签名的 a%b
是一样的符号 a
(当不为零)。
有时候我们需要退一步,看起来只是在数学的:
鉴于int x,y int
如果int i1=x/y和 int i2=x%y
然后y*i1+i2必须x
因此,这是没有那么多的有关标准,但是只有一个办法,这可能。如果任何标准可以将任何其他方式,则该标准是错误的,这意味着语言被打破。