0

有人可以解释一下为什么tr2tr4显示不同的结果:

auto test1 = _mm256_set1_epi8(-1);

    uint64_t tr2 = _mm256_movemask_epi8(test1);
    uint32_t tr3 = _mm256_movemask_epi8(test1);
    uint64_t tr4 = tr3;

_mm256_movemask_epi8(test1) 应该返回 int32,因此将它分配给 int64 应该只分配低位。

相反,tr2打印 0xFFFFFFFFFFFFFFFF 和tr4打印 0x00000000FFFFFFFF

作为tr4有什么表现吗?

我对 C++ 和内在函数都很陌生,所以也许我遗漏了一些明显的东西。

我正在使用 Visual Studio 2019 C++ 编译器。

4

1 回答 1

2

正如上面的保罗所说,这与用更大的整数分配有符号/无符号有关。这是一个例子:

#include <iostream>
#include <iomanip>

int main()
{
    int32_t negInt = -1;
    uint32_t unInt = static_cast<uint32_t>(negInt);
    int64_t negBigInt = static_cast<int64_t>(negInt);
    uint64_t unBigInt = static_cast<uint64_t>(negInt);
    uint64_t fromUnsigned = static_cast<uint64_t>(unInt);

    std::cout << std::hex;
    std::cout << "0x" << std::setfill('0') << std::setw(16) << negInt << "\n";
    std::cout << "0x" << std::setfill('0') << std::setw(16) << unInt << "\n";
    std::cout << "0x" << std::setfill('0') << std::setw(16) << negBigInt << "\n";
    std::cout << "0x" << std::setfill('0') << std::setw(16) << unBigInt << "\n";
    std::cout << "0x" << std::setfill('0') << std::setw(16) << fromUnsigned << "\n";
}

这打印:

0x00000000ffffffff
0x00000000ffffffff
0xffffffffffffffff
0xffffffffffffffff
0x00000000ffffffff

所以 Paul 是对的,但值得注意的是,如果您将带符号的数字分配给更高位宽的字段,则不会发生这种情况。

于 2020-03-12T12:07:18.943 回答