当前位置:  开发笔记 > 编程语言 > 正文

VS编译警告:32位移位的结果隐式转换为64位

如何解决《VS编译警告:32位移位的结果隐式转换为64位》经验,为你挑选了1个好方法。

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。

但是,我到底该如何告诉编译器它永远不会做呢?

我发现了一个相关的问题,但没有提供适当的答案。

谢谢



1> NathanOliver..:

编译器抱怨是因为您将结果存储在64位变量中,因此它假定您实际上要执行64位移位而不是32位移位。您可以使用解决此问题

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

使其强制为64位移位。

如果hi是,它也不会抱怨unint32_t

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有