gpt4 book ai didi

c++ - VS 编译警告 : result of 32-bit shift implicitly converted to 64 bits

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:08 25 4
gpt4 key购买 nike

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 , 但没有提供正确的答案。

谢谢

最佳答案

编译器提示是因为您将结果存储在 64 位变量中,因此它假设您实际上想要进行 64 位移位而不是 32 位移位。您可以使用

hi += 1ULL << (PRECISION - 1 - i);

强制它是一个 64 位移位。

如果 hiunint32_t,它也不会提示。

关于c++ - VS 编译警告 : result of 32-bit shift implicitly converted to 64 bits,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41727042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com