【发布时间】:2018-09-26 09:54:46
【问题描述】:
按位运算符(~、&、| 和 ^)对其提升的操作数的按位表示进行运算。这样的操作会导致未定义的行为吗?
例如,~ 运算符在 C 标准中是这样定义的:
6.5.3.3 一元算术运算符
~运算符的结果是其(提升的)操作数的按位补码(即,当且仅当未设置转换后的操作数中的相应位时,结果中的每个位都被设置)。整数提升在操作数上执行,结果具有提升的类型。如果提升的类型是无符号类型,则表达式~E等于该类型中可表示的最大值减去E。
在所有架构上,~0 生成一个位模式,其中符号位设置为 1,所有值位设置为 1。在一个补码架构上,这种表示对应于一个负零。这个位模式可以是陷阱表示吗?
对于更常见的架构,是否还有其他涉及简单位运算符的未定义行为示例?
【问题讨论】:
-
不,在一个补码体系结构上,
~0生成一个位模式,其中 all 位设置为1。为什么你认为非符号位会保持为零?这不是按位补码。 -
1999 C 标准,第 6.5 节第 4 段。“一些运算符(一元运算符
~和二元运算符<<、>>、&、^和 @ 987654341@,统称为按位运算符)必须具有整数类型的操作数。这些运算符返回的值取决于整数的内部表示,并且具有有符号类型的实现定义和未定义方面 。” (我的粗体强调)。 -
@chqrlie 好的,尽管该线程可以使用标准引号。也许也相关this thread - 因为标准中的脚注,算术运算不能产生陷阱表示。 (大概意思是“除了已经定义的负零情况”)
-
去掉了双重标签——问题中的标准引号和答案全部地址C; C++ 是一种不同的语言,不同语言的问题不应该被双重标记,除非它们是关于互操作性等的。
标签: c language-lawyer bitwise-operators ones-complement