__ mm256_movemask_epi8至uint64_t

问题描述 投票:0回答:1

有人可以解释一下为什么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 ++编译器。

c++ visual-c++ intrinsics
1个回答
0
投票

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

#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是对的,但值得注意的是,如果将signed数字分配给较高位宽的字段,则不会发生这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.