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