Lig*_*ica 9

在C ++ 20中,是的。

以下是如何[expr.xor]定义它:

给定转换后的操作数xy的基数2表示形式的系数x iy i,结果r的基数2表示形式的系数r i为1(如果存在)(但不是)两者的) X ÿ 是1,否则为0。

[basic.fundamental]涵盖了以2为基的表示形式的含义:

宽度为N的无符号整数类型的每个值x都有唯一的表示形式x = x 0 2 0 + x 1 2 1 +…+ x N-1 2 N-1,其中每个系数x i为0或1;这称为x的以2基的表示形式。有符号整数类型的值的以2为基数的表示形式是相应的无符号整数类型的全等值的以2为基数的表示形式。

简而言之,“物理上”的完成方式并不重要:操作必须满足base-2的更抽象的算术概念(无论是否与内存中的位匹配;当然,实际上会匹配),因此XOR是完全定义良好的。

然而,情况并非总是如此。P1236R1引入了该措辞,以使其清晰地知道整数运算的行为方式,并抽象出“位”这种毛茸茸的概念。

在C ++ 11中,我们所知道的是带符号整数必须遵循“使用二进制数字0和1的整数的位置表示形式,其中连续位表示的值是加法的,以1开头,然后乘以连续的2的整数次幂,除了“最高位置的位 ”(脚注49;应注意,这是非规范性的)。

实际上,这为我们提供了大部分途径,但是其中没有具体的措辞[expr.xor]:我们所知道的是“结果是操作数的按位异或功能”。在此关头,是否指的是充分理解的操作实际上取决于您。请注意,您将很难找到关于该操作被允许执行的异议的意见。

所以:

在C ++ 11中,YMMV。

  • 我认为值得一提的是,所有这些都是C ++ 20的措辞。毕竟这个问题被标记为C ++ 11。 (2认同)

LWi*_*sey 6

或者至少对于问题的未编辑版本,其写为:

2 ^ 32 == 34

假设关系运算符==优先级高于按位XOR ^,则表达式的求值为:

2 ^ (32 == 34)

那是: 2 ^ 0

根据定义2,因此true

  • 可爱的...但是我不认为这是OP想要问的。:P (2认同)

Mar*_*som -1

我不知道标准是否正式定义了异或,但这是一个众所周知的操作,具有一致的定义。标准中明确遗漏的一件事是整数到位的映射。您的断言适用于常用的补码表示和不常见的补码。