错误:{}中的“ 18446744069414584320ull”从“ long long unsigned int”转换为“ int”的转换变窄

时间:2019-04-17 19:08:33

标签: c++

这段代码有什么问题?我正在使用GCC 6.3。

https://ideone.com/ektGEp

  

a.cpp:在函数'int main()':`a.cpp:26:24:错误:在{}内将'18446744069414584320ull'从'long long unsigned int'转换为'int'的转换变窄{} [-缩小]

#include <iostream>
using namespace std;
#include <smmintrin.h>
#include <emmintrin.h>
#include <tmmintrin.h>

typedef union {
        __m64  mm64[2];
        __m128 mm128i;
} sse2_t;

#define const_epi32( i3,i2,i1,i0 )      \
            { static_cast<unsigned long long> (static_cast<unsigned long long>(i1) << 32), \
              static_cast<unsigned long long> (static_cast<unsigned long long>(i3) << 32) }

int main() {

        sse2_t arr_val[3] = { const_epi32(0,-1,0,-1),
                          const_epi32(0, 0,-1, -1),
                          const_epi32(0, 0,0, 1024) 
                        }; //error!

        sse2_t val = const_epi32(0,-1,0,-1); // ok!
        // your code goes here
        return 0;
}

3 个答案:

答案 0 :(得分:1)

类型__m64__m128非常特殊,代表向量寄存器,这意味着您不能以通常的方式为它们分配值(就像您似乎在尝试在代码中进行操作) 。您需要使用特殊的加载函数将数据放入寄存器,并使用特殊的存储函数从那里获取数据。

以下是如何将数据(四个浮点数)加载到__m128变量中的示例:

#include <cstring>
#include <smmintrin.h>
int main() {
  float f[4];
  memset(f, 0, 16);
  __m128 a = _mm_load_ps(f);
  return 0;
}

此页面上有许多有关所有不同类型和内部函数的信息:https://software.intel.com/sites/landingpage/IntrinsicsGuide/

答案 1 :(得分:1)

#define const_epi32( i3,i2,i1,i0 )      \
        { _m_from_int64( (static_cast<unsigned long long>(i1) << 32), \
          _m_from_int64( (static_cast<unsigned long long>(i3) << 32) }

答案 2 :(得分:0)

部分const_epi32(0, 0,-1, -1)引起警告,因为您正在将'0xffffFFFFffffFFFFFF'分配给正在缩小的32位'int'。

我认为其他情况不会引起警告,因为分配的值是一个不变的0,不会变窄。

另一个问题是,为什么__m64int。我假设__m64无法直接分配给(即MM寄存器),并且缩小检查(至少对于常量分配而言)在编译器中是虚假的。