我尝试找到一个列出所有可能性的好答案(也许只有一种?)。
那么考虑到有符号数和无符号数,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(使用前将#替换为@)