一个&的结果是什么? B'

时间:2015-04-01 15:13:36

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

这很尴尬,但按位AND运算符在C ++标准中定义如下(强调我的)。

  

执行通常的算术转换; 结果是其操作数的按位AND功能。运算符仅适用于整数或无范围的枚举操作数。

这看起来对我来说毫无意义。据我所知,“按位AND函数”在标准中的任何地方都没有定义。

我知道AND功能已被充分理解,因此可能不需要解释。 “按位”一词的含义也应该相当清楚:该函数应用于其操作数的相应位。但是,构成操作数位的构成并不清楚。

是什么给出了?

4 个答案:

答案 0 :(得分:40)

这是不明确的。标准在引用逐位操作时的含义问题是一些缺陷报告的主题。

例如defect report 1857: Additional questions about bits

  

5.11 [expr.bit.and]中按位操作的规范,   5.12 [expr.xor]和5.13 [expr.or]在描述操作时使用未定义的术语“按位”,而不指定它是否是   视图中的值或对象表示。

     

这部分解决方案可能是定义“位”(即   否则目前在C ++中未定义)作为给定功率的值   2。

并且回复是:

  

CWG决定重新制定运营描述   他们自己避免引用比特,分裂更大   定义“位”之类的问题,以便进一步发布1943年   考虑。

defect report 1943说:

  

CWG在2014-06(Rapperswil)会议上决定仅解决一个问题   1857年和1861年提出的问题的有限部分。这   issue是剩余问题的占位符,例如定义a   根据值2 n 的“位”,指定位字段是否具有a   标志位等。

我们可以从这个defect report 1796: Is all-bits-zero for null characters a meaningful requirement?看到,这个标准在引用受影响/影响其他部分时所涉及的问题:

  

根据2.3 [lex.charset]第3段,

     
    

基本执行字符集和基本执行宽字符集应各自包含基本的所有成员     源字符集,加上代表警报的控制字符,     退格和回车,加上一个空字符(分别为     null宽字符),其表示具有全零位。

  
     

目前尚不清楚便携式程序是否可以检查数据的位   表示;相反,它似乎仅限于检查   与值表示相对应的数字位   (3.9.1 [basic.fundamental]第1段)。这可能更合适   要求空字符值比较等于0或' \ 0'   而不是指定表示的位模式。

     

对shift,bitwise和and的定义也有类似的问题   按位或运算符:是对位的那些规范约束   表示的模式或由此产生的值   将这些模式解释为数字?

在这种情况下,决议要改变:

  

表示具有全零位

为:

  

值为0.

请注意,as mentioned in ecatmur's answer草案C ++标准确实遵循5.2.4.2.13.9.1 [basic.fundamental] 中的C标准部分3它没有引用C标准中的6.5/4部分,它至少会告诉我们结果是实现定义的。我在下面的评论中解释说,C ++标准只能明确地包含来自规范引用的文本。

答案 1 :(得分:9)

[basic.fundamental] / 3遵循C 5.2.4.2.1。 C ++中的按位运算符未被指定应该同样遵循C,在这种情况下6.5.10 / 4:

这似乎是合理的。
  

二进制&的结果operator是操作数的按位AND(也就是每个位   当且仅当转换的操作数中的每个相应位都是时,才设置结果   设定)。

请注意,C 6.5 / 4有:

  

一些运算符(一元运算符~和二元运算符<<>>&^|,   统称为位运算符)需要具有的操作数   整数类型。这些运算符产生的值取决于内部表示   整数,并为签名类型提供实现定义和未定义的方面。

整数的内部表示当然在6.2.6.2/1,/ 2中描述。

答案 2 :(得分:6)

C ++ Standard将 storage 定义为一定数量的位。实现可能决定归属于特定位的含义;话虽如此,二元AND应该在概念0和1上工作,形成特定类型的表示。

  

3.9.1.7。(...)整数类型的表示应使用纯二进制计算系统定义值。 49 (...)< / p>      

3.9.1,脚注49)使用二进制数字0和1的整数的位置表示,其中连续表示的值   位是加法的,以1开始,并乘以2的连续积分幂,除了可能是最高位   位置

这意味着对于所使用的任何物理表示,二进制AND根据AND函数的真值表行动(对于每个位号i,取位A i 和B i 来自适当的操作数,只有当两者都为1时才产生值1,否则为R i 位产生0。所得到的值留待实现解释,但无论选择什么,它必须与其他二进制操作(如OR和XOR)的其他期望一致。

答案 3 :(得分:3)

从法律上讲,我们可以认为所有按位操作都有未定义的行为,因为它们实际上没有定义。

更合理的是,我们期望应用常识并参考这些操作的常见含义,将它们应用于操作数的(因此术语&#34;按位&#34; )。

但实际上并没有说明这一点。惭愧我的回答不能被视为规范措辞。