假设 ab 都是这两个类型的 int, , b 非零。审议结果的执行 a/b 在下列情况下:

  1. ab 都非负。
  2. ab 都是负面的。
  3. 正是他们中的一个是负面的。

在情况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 (当不为零)。

只是一个意见。目前的工作草案C++标准实际上纠正了"执行情况定义"的问题,并要求对截断对零。 在这里, 委员会的网页, 在这里, 是的草案。问题是至112页.

有时候我们需要退一步,看起来只是在数学的:

鉴于int x,y int

如果int i1=x/y和 int i2=x%y

然后y*i1+i2必须x

因此,这是没有那么多的有关标准,但是只有一个办法,这可能。如果任何标准可以将任何其他方式,则该标准是错误的,这意味着语言被打破。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top