这很尴尬,但按位AND运算符在C ++标准中定义如下(强调我的)。
执行通常的算术转换; 结果是其操作数的按位AND功能。运算符仅适用于整数或无范围的枚举操作数。
这看起来对我来说毫无意义。据我所知,“按位AND函数”在标准中的任何地方都没有定义。
我知道AND功能已被充分理解,因此可能不需要解释。 “按位”一词的含义也应该相当清楚:该函数应用于其操作数的相应位。但是,构成操作数位的构成并不清楚。
是什么给出了?
答案 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年 考虑。
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.1
段3.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; )。
但实际上并没有说明这一点。惭愧我的回答不能被视为规范措辞。