移位何时会导致未定义的行为

2023-12-04

我尝试找到一个列出所有可能性的好答案(也许只有一种?)。

那么考虑到有符号数和无符号数,C 语言中导致 UB 移位的方法有哪些?


C99 标准对按位移位运算符有这样的规定(添加了强调,并且^用于表示求幂):

§6.5.7.3:对每个操作数执行整数提升。结果的类型是提升后的左操作数的类型。如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。
§6.5.7.4: 的结果E1 << E2 is E1左移E2位位置;空出的位用零填充。如果E1具有无符号类型,结果的值为E1 × 2^E2,比结果类型中可表示的最大值减少模一。如果E1具有有符号类型和非负值,并且E1 × 2^E2可以用结果类型表示,那么这就是结果值;否则,行为是未定义的。
**§6.5.7.5
: 的结果E1 >> E2 is E1右移E2位位置。如果E1具有无符号类型或者如果E1具有有符号类型和非负值,结果的值是商的整数部分E1 / 2^E2. If E1具有有符号类型和负值,结果值是实现定义的。

因此,总而言之,如果满足以下任一条件,则行为是未定义的:

  • 右操作数有符号且为负,或者
  • 右操作数大于或等于左操作数的宽度(提升后),或者
  • 左操作数有符号且为负,或者
  • 执行左移并且左操作数是有符号的,并且结果值不能表示为有符号整数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

移位何时会导致未定义的行为 的相关文章

随机推荐