MSVC:班次计数为负或太大

时间:2018-08-03 11:29:26

标签: c++ visual-studio-2017 c++17

我正试图绕过MSVC发出的警告。据我所知,警告似乎是虚假的,但我想确定。

我正在尝试将off_t转换为OVERLAPPED中的偏移量。给定一个名为offset的off_t和一个重叠的OVERLAPPED,我正在尝试以下操作:

overlapped.Offset = static_cast<DWORD>(offset);
if constexpr(sizeof(offset) > 4) {
    overlapped.OffsetHigh = static_cast<DWORD>(offset >> 32);
}

MSVC抱怨位移,假装位移计数为负或太大。由于它显然不是负面的-甚至MSVC也应该能够说明这一点-它必须认为它太大了。

怎么会太大呢?仅在off_t的大小大于4的情况下,才编译所讨论的代码。因此,它必须至少为5个字节(但可能为8个字节),并且给该字节赋予8位,表示至少40位,大于40位。 32。

这是怎么回事?

1 个答案:

答案 0 :(得分:1)

是否可能是由于分配到overlaying.OffsetHigh而不是您的显式班次引起警告?以下代码在针对x86 32位的VS2015编译时生成相同的警告:

struct Clump
{
    unsigned int a : 32;
    unsigned int b : 32;
    unsigned int c : 32;
};

unsigned int x = 0;
unsigned int y = 0;
unsigned int z = 0;

Clump clump = { x, y, z }; // This is line 1121.

1>E.cpp(1121): warning C4293: '<<': shift count negative or too big, undefined behavior

但是删除位字段,没有警告:

struct Clump
{
    unsigned int a;
    unsigned int b;
    unsigned int c;
};

unsigned int x = 0;
unsigned int y = 0;
unsigned int z = 0;

Clump clump = { x, y, z }; // No warning.