a&b的结果是什么?

R. *_*des 39 c++ bitwise-operators language-lawyer

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

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

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

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

是什么赋予了?

Sha*_*our 40

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

例如缺陷报告1857:关于位的其他问题:

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

解决方案的一部分可能是将"bit"(在C++中当前未定义)定义为给定功率2的值.

而回应是:

CWG决定重新制定操作本身的描述,以避免引用比特,将定义"比特"等更大的问题分开以发布1943以供进一步考虑.

缺陷报告1943说:

CWG在2014-06(Rapperswil)会议上决定仅解决1857年和1861年提出的问题中的一小部分问题.这个问题是其余问题的占位符,例如根据价值定义"位". 2 n,指定位字段是否有符号位等.

我们可以从这个缺陷报告1796中看到:对于空字符,all-bits-zero是否是一个有意义的要求?,这个标准意味着什么时候它引用受影响/影响其他部分的位:

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

基本执行字符集和基本执行宽字符集应各自包含基本源字符集的所有成员,以及表示alert,backspace和回车符的控制字符,以及空字符(分别为null宽字符),其表示具有全零位.

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

对于shift,bitwise和bitwise或operator的定义存在类似的问题:那些规范是对表示的位模式的限制,还是由于将这些模式解释为数字而产生的值?

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

表示具有全零位

至:

值为0.

请注意,正如ecatmur的回答所提到的, C++标准草案确实遵循 C [标准]部分5.2.4.2.1的章节3.9.1 [basic.fundamental],3它没有引用6.5/4C标准中的部分,它至少会告诉我们结果是实现定义的.我在下面的评论中解释说,C++标准只能明确地包含来自规范引用的文本.


eca*_*mur 9

[basic.fundamental]/3 遵循 C 5.2.4.2.1.C++中按位指定的按位运算符应该同样遵循C,在本例中为6.5.10/4,这似乎是合理的:

二进制和运算符的结果是操作数的按位AND(即,当且仅当设置了转换的操作数中的每个相应位时,才设置结果中的每个位).

请注意,C 6.5/4具有:

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

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


Bar*_*icz 6

C++ Standard将存储定义为一定量的位.实现可能决定归属于特定位的含义; 话虽这么说,二元AND应该在概念0和1上工作,形成一个特定类型的表示.

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

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

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