c++ - 需要二进制补码的 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 并不强制要求补码。)
这仅仅是委员会的优先事项,还是仍有理由不利用两人的补充任务提供的简化和确定性?
解决方案
委员会考虑的具体问题之一是如何处理-INT_MIN
,该民意调查的结果是:
加法/减法/乘法和
-INT_MIN
溢出当前是未定义的行为,它应该是:4:换行
6:换行或陷阱
5:中间值是数学整数
14:现状(保持未定义的行为)
这是明确考虑的,人们认为最好的选择是保持未定义的行为。
为了澄清“中间值是数学整数”,论文的另一部分澄清了这意味着这(int)a + (int)b > INT_MAX
可能是真的。
请注意,如果他们愿意,实现可以在这些情况下自由定义特定行为。我不知道他们中是否有人这样做。
推荐阅读
- python - 如何在pyspark中创建一个包含两个数据框列的字典?
- java - 什么可能导致 Android 上的 DatagramChannel connect() 调用中出现间歇性“权限被拒绝”错误?
- node.js - 承诺在测试开始前解决
- java - HttpSecurity permitAll 和 WebSecurity 忽略 un-Auth URL 的功能?
- angular - 链可观察
- arrays - 不允许通过字符串文字访问 Angular httpClient 对象
- datatables - 如何在数据表中获取最大值?
- xml - 从 XSLT 中的查询参数中提取值
- python-3.x - 在 nn.crossentropyloss 中将期望更改为多维而不是 1D
- javascript - 如何使用 Cypress 将变量的存储值获取到 URL 命令中?