什么';这是a&;B 这是很难的,但是位和操作符在C++标准中定义如下(强调雷)。< /P>

什么';这是a&;B 这是很难的,但是位和操作符在C++标准中定义如下(强调雷)。< /P>,c++,language-lawyer,bitwise-operators,C++,Language Lawyer,Bitwise Operators,执行通常的算术转换结果是其操作数的按位AND函数。运算符仅适用于整型或非作用域枚举操作数 这对我来说有点毫无意义。据我所知,“按位AND函数”在标准的任何地方都没有定义 我知道AND函数已经很好地理解了,因此可能不需要解释。“按位”一词的含义也应该相当清楚:函数应用于其操作数的相应位。但是,操作数的位是由什么组成的尚不清楚 什么?< P>法律上,我们可以考虑所有位运算都有未定义的行为,因为它们实际上没有定义。< /P> 更合理地说,我们希望应用常识并参考这些操作的常见含义,将它们应用于操作数的位

执行通常的算术转换结果是其操作数的按位AND函数。运算符仅适用于整型或非作用域枚举操作数

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

我知道AND函数已经很好地理解了,因此可能不需要解释。“按位”一词的含义也应该相当清楚:函数应用于其操作数的相应位。但是,操作数的位是由什么组成的尚不清楚


什么?

< P>法律上,我们可以考虑所有位运算都有未定义的行为,因为它们实际上没有定义。< /P> 更合理地说,我们希望应用常识并参考这些操作的常见含义,将它们应用于操作数的位(因此称为“按位”)


但事实上没有什么能说明这一点。遗憾的是,我的回答不能被视为规范性措辞。

[basic.basical]/3遵从C 5.2.4.2.1。C++中的位运算符似乎不太合理,应该类似于C,在这种情况下是5.5.10/4:

二进制&运算符的结果是操作数的按位AND(即 当且仅当转换后的操作数中的每个对应位都为 设置)

请注意,C 6.5/4具有:

一些运算符(一元运算符
~
、二元运算符
&
^
|
, 需要具有具有以下属性的操作数(统称为位运算符) 整数类型。这些运算符生成的值取决于的内部表示形式 整数,并且有符号类型的实现定义和未定义方面

整数的内部表示形式当然在6.2.6.2/1、/2中有描述。

C++标准将存储定义为一定数量的位。实现可能决定赋予特定位什么含义;这就是说,二进制和应该在概念0和1上工作,形成特定类型的表示

3.9.1.7.(…)积分类型的表示应使用纯二进制计算系统定义值。49(…)

3.9.1,脚注49)使用二进制数字0和1的整数位置表示法,其中值由连续的 位是加法的,从1开始,然后乘以2的连续整数次幂,但最高的位除外 位置


这意味着,对于使用的任何物理表示,二进制AND根据AND函数的真值表进行操作(对于每个位号i,从适当的操作数中获取位Ai和Bi,仅当两者都为1时才产生值1,否则为位Ri产生0)。。结果值由实现来解释,但无论选择什么,它都必须与关于其他二进制操作(如OR和XOR)的其他预期一致。

这是未指定的。当标准提到位操作时,它意味着什么是一些缺陷报告的主题

例如:

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

部分解决方案可能是定义“位”(即 否则当前在C++中未定义为给定的 二,

答复是:

CWG决定重新制定操作说明 避免引用位,将较大的 定义“bit”的问题以及类似问题将于1943年发布,以供进一步讨论 考虑

并说:

CWG在2014-06年(Rapperswil)会议上决定只解决一个问题 1857年和1861年问题提出的问题的有限子集。这 issue是剩余问题的占位符,例如定义 以2n值表示的“位”,指定位字段是否具有 符号位等

我们可以从中看出,当标准涉及受影响的位/影响的其他部分时,该标准的含义问题也会影响:

根据2.3[字符集法]第3款

基本执行字符集和基本执行范围字符集应分别包含基本执行字符集的所有成员 源字符集,加上表示警报的控制字符, 退格和回车,加上一个空字符(分别, 空字符),其表示形式包含所有零位

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

移位、按位and和and的定义也存在类似的问题 按位or运算符:这些规范是对位的约束吗 表示形式的模式或基于 将这些模式解释为数字

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

表示具有所有零位

致:

值为0

请注意,C++标准草案在c节>3.91基础[Cask.Basic ]中遵从C标准章节<代码> 5.2.4.2.1。