Visual Studio 2013在以下问题上发出令人烦恼(并且看似无关紧要)的编译警告:
#include
#define PRECISION 16
uint64_t hi = 0;
for (uint8_t i = 0; i < PRECISION; i++)
{
if (some_condition)
{
hi += 1 << (PRECISION - 1 - i);
}
}
这是编译警告:
warning C4334: '<
result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)
当改变1<<<< (PRECISION-1-i)至1<< (PRECISION - 1). 所以我一直试图找出1<<<< (PRECISION - 1 - i). 显然,如果i> = = PRECISION,那么左移操作将产生未定义的行为. 但是,变量i不超过PRECISION – 1的值. 而且,即使我们假设编译器无法推断出这个事实,我也看不出这个编译警告与由于左移操作数引起的潜在的未定义行为有什么关系. 也许它假定PRECISION的无符号值 – 1 – i可以大于31. 但我究竟应该如何告诉编译器它从来没有呢? 我找到了one related question,但没有提供正确的答案.
谢谢