【发布时间】:2017-01-18 18:40:21
【问题描述】:
Visual Studio 2013 在以下位置发出烦人(且看似无关)的编译警告:
#include <stdint.h>
#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,但没有提供正确的答案。
谢谢
【问题讨论】:
标签: c++ visual-studio compiler-warnings bit-shift