整数异或C++的可能结果

Possible results of integer xor in C++

本文关键字:结果 C++ 整数      更新时间:2023-10-16

能保证(2 ^ 32) == 34吗?

在 C++20 中,是的。

以下是[expr.xor]的定义:

给定转换操作数 x 和 y 的以 2 为底表示 ([basic.fundamental]) 的系数 x i 和 y i,

如果xi 和yi 的任一(但不是两者)为 1,则结果r的以 2 为底表示的系数ri为 1,否则为 0。

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

宽度为 N 的无符号整数类型的每个值 x 都有一个唯一的表示形式 x = x 0 2 0 + x 1 2 1 + ... + x N-1 2

N-1,其中每个系数 xi为 0 或 1;这称为x底 2 表示形式.有符号整数类型值的基数为 2 表示形式是相应无符号整数类型的全等值的基数 2 表示形式。

简而言之,它如何"物理"完成并不重要:操作必须满足更抽象的算术概念 base-2(无论这是否与内存中的位匹配;当然在现实中它会),因此 XOR 是完全明确定义的。

然而,情况并非总是如此。该措辞是由P1236R1引入的,以明确整数运算的行为方式,并抽象出"位"的那种毛茸茸的概念。

在C++11中,我们所知道的是,有符号整数必须遵循"使用二进制数字0和1的整数的位置表示,其中由连续位表示的值是加法的,从1开始,并乘以2的连续积分幂,除了可能具有最高位置的位">(脚注49;请注意,这是非规范的)。

实际上,这让我们大部分时间都在那里,但[expr.xor]中的具体措辞并不存在:我们所知道的是"结果是操作数的按位独占 OR 函数"。在这个关头,这是否是指一个足够普遍理解的操作,实际上取决于你。请注意,您很难找到有关此操作被允许做什么的不同意见。

所以:

C++11年,YMMV。

的或者至少对于问题的未编辑版本,当它被写成:

2 ^ 32 == 34

给定关系运算符==的优先级高于按位 XOR^,表达式的计算公式为:

2 ^ (32 == 34)

即:2 ^ 0

根据定义,这是2的,因此true

无论值在内部如何表示,2 ^ 32的结果都是34^运算符表示二进制 XOR,如果正确执行该操作,则必须获得的结果与执行操作的方式无关。

2 + 32也是如此。你可以用二进制、十进制或任何其他你想要的方式表示 2 和 32,但你得到的结果最好是你表示 34 的方式,不管那是什么。

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