按位运算符可以有未定义的行为吗?

时间:2017-09-24 07:33:53

标签: c++ c language-lawyer bitwise-operators ones-complement

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

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

  

6.5.3.3一元算术运算符

     

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

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

是否存在涉及更常见架构的简单位运算符的未定义行为的其他示例?

1 个答案:

答案 0 :(得分:10)

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

  

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

然后,补充系统并不完全相同;例如GCC不支持任何!

C11确实意味着实现定义和未定义的方面仅允许signed types(C11 6.5p4)。