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

时间:2013-08-30 06:01:12

标签: c++

在测试用例中编写一些寄存器时,我遇到了这个声明。我是C ++的新手。如果这是一个愚蠢的问题,请提前抱歉。

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

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

2 个答案:

答案 0 :(得分:2)

让我们简化:

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;

base_width的最终结果为26637.根据标准的符合性实施,至少。

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

答案 1 :(得分:0)

想想二元的转变:

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