【问题标题】:Can xor have UB/IB in C++?在 C++ 中 xor 可以有 UB/IB 吗?
【发布时间】:2021-08-05 20:57:07
【问题描述】:

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

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

【问题讨论】:

  • 另一个问题被标记为 C++ 和 C。这不是我们的错,那里没有令人满意的 C++ 答案。这个问题感觉像是重复的。 C11 的答案和以前一样。
  • 你问的是什么版本的 C++?很确定它在 C++20 中定义良好,因为现在保证有符号整数是二进制恭维的。在那之前。最有可能实现定义的行为。
  • 嗯,这是来自 C++20 的文本(实际上是现在的 C++23 草案),在我看来,它似乎没有给价值留下任何余地:@987654323 @
  • 我从其他问题中删除了 C++ 标签(它们不应该是双重标签,并且没有任何 C++ 答案)
  • 这些运算符是在位上定义的。理论上,唯一定义的实现将是 C++ 20 之前的负数的实际整数值。

标签: c++ undefined-behavior implementation-defined-behavior


【解决方案1】:

根据Bitwise logic,整数类型的结果中xor不能有UB或IB。

xor 运算符对可能导致未定义行为的其他类型的两个操作数执行usual arithmetic conversions

【讨论】:

  • 抱歉,我很抱歉,但是对于不支持有符号整数中的负零的补码系统是否有任何陷阱值(如 this answer 中的 C 所指出的那样)?
  • @0dminnimda 注意 "...但是,所有 C++ 编译器都使用二进制补码表示,从 C++20 开始,它是标准允许的唯一表示,... " en.cppreference.com/w/cpp/language/types 。自 C++11 以来,"...8 位反码和 char 的符号和大小表示已被禁止 ..." 相同链接
猜你喜欢
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 2016-09-11
  • 1970-01-01
  • 2016-09-04
相关资源
最近更新 更多