【问题标题】:Is shifting std::bitset<N> more than N positions undefined behavior?移动 std::bitset<N> 是否超过 N 个位置未定义行为?
【发布时间】:2018-07-04 13:36:52
【问题描述】:

Is right shift undefined behavior if the count is larger than the width of the type? 中所述,如果移位次数超过有效操作数大小,则移位值未定义。

因此,在下面,bar 的值是未定义的:

uint32_t foo = 123;
uint32_t bar = (foo >> 33);

这种移位操作是否为std::bitset 定义得很好?如:

std::bitset<32> foo(123);
std::bitset<32> bar(foo >> 33);

在哪个官方文档中可以找到这些信息?

cppreference (https://en.cppreference.com/w/cpp/utility/bitset/operator_ltltgtgt) 上没有明确说明这种情况。

【问题讨论】:

  • 请注意undefined behaviorimplementation-defined result 不同。前者实际上可以使任何事情发生,后者确保结果记录在您正在使用的编译器/体系结构中(如果它是兼容的)。例如,sizeof int 是实现定义的,*nullptr 是未定义的
  • @pqnet:我们可能都知道你对最后一个的意思是什么,但我真的想指出*nullptr 格式不正确,而*(int*)nullptr 是UB。

标签: c++ c++11 c++14 language-lawyer bit-shift


【解决方案1】:

结果被标准定义为0,[bitset.members]/9

bitset& 运算符>>=(size_t pos) noexcept;

9 效果:将 *this 中位置 I 的每个位替换为一个值 确定如下:

(9.1) 如果pos >= N - I,则新值为零;

(9.2) 如果 pos

【讨论】:

猜你喜欢
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
相关资源
最近更新 更多