xor 可以在 C++ 中拥有 UB/IB 吗?

Can xor have UB/IB in C++?

提问人:0dminnimda 提问时间:8/6/2021 最后编辑:0dminnimda 更新时间:8/6/2021 访问量:134

问:

看到这些问题的答案(这个和这个)谈论 C,我无法将这些知识扩展到 C++,所以这不是重复,而是澄清。

更新:我只是在谈论 C++。如果某物是用 C 语言定义的,这并不意味着它是用 C++ 定义的,反之亦然,这就是我问这个问题的原因。

C++ 未定义 实现定义行为

评论

1赞 Wyck 8/6/2021
另一个问题被标记为 C++ 和 C。这不是我们的错,那里没有令人满意的 C++ 答案。这个问题确实感觉像是重复的。C11 的答案和以前一样来了。
1赞 NathanOliver 8/6/2021
你问的是哪个版本的 C++?可以肯定的是,这是 C++20 中定义良好的行为,因为有符号整数现在保证是二互补。在此之前。最有可能实现定义的行为。
1赞 NathanOliver 8/6/2021
好吧,这是 C++20 的文本(现在是 C++23 草案),在我看来,它似乎没有留下任何回旋余地来了解价值可能是什么:timsong-cpp.github.io/cppwp/expr.xor
3赞 M.M 8/6/2021
我从其他问题中删除了 C++ 标签(它们不应该被双重标记,并且没有任何 C++ 答案)
1赞 Phil1970 8/6/2021
这些运算符是在位上定义的。从理论上讲,唯一定义的实现是 C++ 20 之前负数的实际整数值。

答:

1赞 273K 8/6/2021 #1

根据按位逻辑,异或在整数类型的结果中不能有 UB 或 IB。

xor 运算符对可能导致未定义行为的其他类型的两个操作数执行通常的算术转换

评论

0赞 0dminnimda 8/6/2021
对不起,我一丝不苟,但是对于一个的补码系统,是否有任何陷阱值不支持有符号整数中的负零(正如本答案中对 C 所指出的)?
2赞 Richard Critten 8/6/2021
@0dminnimda指出,“......但是,所有C++编译器都使用 2 的补码表示,并且从 C++20 开始,它是标准允许的唯一表示形式,...“ en.cppreference.com/w/cpp/language/types 。还有“......自 C++11 以来,字符的 8 位补码和符号和大小表示已被禁止......“ 相同的链接