整数异或C++的可能结果
Possible results of integer xor in C++
能保证(2 ^ 32) == 34
吗?
在 C++20 中,是的。
以下是[expr.xor]
的定义:
如果xi 和yi 的任一(但不是两者)为 1,则结果r的以 2 为底表示的系数ri为 1,否则为 0。
[basic.fundamental]
涵盖了以 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 的方式,不管那是什么。
我不知道该标准是否正式定义了排他性或,但这是一个众所周知的操作,具有一致的定义。标准中明确遗漏的一件事是整数到位的映射。您的断言适用于常用的二进制补码表示和不常见的补码表示。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- 为什么这个程序的结果是3 "born"?和 4 死
- 尝试将字符串/字符转换为整数会产生意外结果