按位运算符可能具有未定义的行为?

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

例如, ~运算符在C标准中以这种方式定义:

6.5.3.3一元算术运算符

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

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

是否还有其他未定义行为的例子,涉及更简单的按位运算符,用于更常见的体系结构?


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

如果实现不支持负零,则带有操作数的&,|,^,〜,<<和>>运算符会产生这样的值的行为是未定义的。

然后再补充系统并不是很常见; 例如GCC不支持任何!

C11确实意味着实现定义和未定义的方面仅适用于签名类型(C11 6.5p4)。

链接地址: http://www.djcxy.com/p/72677.html

上一篇: Can bitwise operators have undefined behavior?

下一篇: implemenation of sets using bits