关于移位运算符及其在C++中的优先级

Regarding the shift operator and its precedence in C++

本文关键字:C++ 优先级 于移位 运算符      更新时间:2023-10-16

在测试用例中对一些寄存器进行编程时,我遇到了以下语句。我是C++新手。如果这是一个愚蠢的问题,请提前道歉。

base_width = 13; // assume 32 bit number
base_width +=  (base_width << 6) << 5;

考虑到base_width是一个32位的unsigned int,执行以上操作后,base_width的值应该是多少?我尝试了不同的编译器,结果不同。根据C++标准,答案应该是什么?为什么?

让我们简化一下:

base_width = 13; // assume 32 bit number
base_width += (base_width << 6) << 5;
base_width = 13 + ((13 << 6) << 5);
base_width = 13 + (832 << 5);
base_width = 13 + 26624;
base_width = 26637;

CCD_ 4的最终结果为26637。至少根据标准的一致性实施。

如果你在不同的编译器上得到了不同的结果,那么要么a)你的编译器是垃圾(不太可能),要么b)你的代码与你发布的代码不同(更有可能)。

想想二进制中的移位:

base_width = 13; // 1101 (base 2)
(base_width << 6) // 1101000000 (base 2)
(base_width << 6) << 5 // 110100000000000 (base 2) = 26624

结果:

base_width += (base_width << 6) << 5; // 13 + 26624 = 26637