15

按位运算符(~&和)对其提升的操作数的按位表示进行运算|^这样的操作会导致未定义的行为吗?

例如,~运算符在 C 标准中是这样定义的:

6.5.3.3 一元算术运算符

运算符的结果~是其(提升的)操作数的按位补码(即,当且仅当未设置转换操作数中的相应位时,结果中的每个位都被设置)。整数提升在操作数上执行,结果具有提升的类型。如果提升的类型是无符号类型,则表达式~E等效于该类型中可表示的最大值 minus E

在所有架构上,~0生成符号位设置为1且所有值位设置为的位模式1。在一个补码架构上,这种表示对应于一个负零。这个位模式可以是陷阱表示吗?

对于更常见的架构,是否还有其他涉及简单位运算符的未定义行为示例?

4

1 回答 1

11

对于一个人的补码系统,明确列出了那些不支持有符号整数中的负零的陷阱值的可能性(C11 6.2.6.2p4):

如果实现不支持负零,则 &、|、^、~、<< 和 >> 运算符的行为以及会产生此类值的操作数是未定义的。

再说一次,一个人的补体系统并不常见。例如GCC不支持任何!

C11 确实暗示实现定义和未定义的方面只允许用于有符号类型(C11 6.5p4)。

于 2017-09-24T07:57:11.507 回答