在测试用例中编写一些寄存器时,我遇到了这个声明。我是C ++的新手。如果这是一个愚蠢的问题,请提前抱歉。
base_width = 13; // assume 32 bit number
base_width += (base_width << 6) << 5;
考虑到base_width
是32位unsigned int
,在执行上述操作后,base_width
的值应该是多少?我试过不同的编译器,它给出了不同的结果。根据C ++标准,答案应该是什么?为什么?
答案 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