首页 > 解决方案 > 需要二进制补码的 C++20 的分支

问题描述

C++20 将指定有符号整数类型必须使用二进制补码。鉴于(实际上?)每个实现当前都使用二进制补码,这似乎不是一个大的变化。

但我想知道这种变化是否会将一些“未定义的行为”转变为“实现定义”甚至“定义”。

考虑一下绝对值函数std::abs(int)及其一些重载。C++ 标准通过引用 C 标准来包含此函数,该标准表示如果无法表示结果,则行为未定义。

在二进制补码中,没有正对应项INT_MIN

abs(INT_MIN) == -INT_MIN == undefined behavior

在符号幅度表示中,有:

-INT_MIN == INT_MAX

abs()因此,留下一些未定义的行为似乎是合理的。

一旦需要二进制补码,似乎abs(INT_MIN)可以完全指定 ' 的行为,或者至少定义实现,而没有任何向后兼容性问题。但我没有看到任何这样的改变提议。

我看到的唯一缺点是 C++ 标准需要abs()明确指定,而不是引用 C 标准对abs(). (据我所知,C 并不强制要求补码。)

这仅仅是委员会的优先事项,还是仍有理由不利用两人的补充任务提供的简化和确定性?

标签: c++undefined-behaviortwos-complementc++20

解决方案


委员会考虑的具体问题之一是如何处理-INT_MIN,该民意调查的结果是:

加法/减法/乘法和-INT_MIN溢出当前是未定义的行为,它应该是:

4:换行
6:换行或陷阱
5:中间值是数学整数
14:现状(保持未定义的行为)

这是明确考虑的,人们认为最好的选择是保持未定义的行为。

为了澄清“中间值是数学整数”,论文的另一部分澄清了这意味着这(int)a + (int)b > INT_MAX可能是真的。


请注意,如果他们愿意,实现可以在这些情况下自由定义特定行为。我不知道他们中是否有人这样做。


推荐阅读