C++20将规定有符号整型必须使用二进制补码。鉴于(几乎?)每个实现当前都使用二进制补码,这似乎不是一个很大的变化。
但我想知道这个变化是否会将一些“未定义行为”转变为“实现定义”甚至“已定义”。
考虑绝对值函数
在二进制补码中,不存在
因此,
一旦需要使用二进制补码,
我唯一看到的缺点是C++标准需要明确指定
这只是委员会没有优先考虑还是仍有原因不能利用二进制补码强制规定提供的简化和确定性?
但我想知道这个变化是否会将一些“未定义行为”转变为“实现定义”甚至“已定义”。
考虑绝对值函数
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并不强制要求使用二进制补码。)这只是委员会没有优先考虑还是仍有原因不能利用二进制补码强制规定提供的简化和确定性?