繁体   English   中英

错误:'18446744069414584320ull'从'long long unsigned int'到'int'的缩小转换{} [-Wnarrowing]

[英]error: narrowing conversion of ‘18446744069414584320ull’ from ‘long long unsigned int’ to ‘int’ inside { } [-Wnarrowing]

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

https://ideone.com/ektGEp

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

#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;
}

__m64__m128类型非常特殊,表示向量寄存器,这意味着您不能以通常的方式为它们赋值(就像您在代码中试图做的那样)。 您需要使用特殊的加载函数将数据放入寄存器,并使用特殊的存储函数从那里取回数据。

以下是如何将数据(四个浮点数)加载到__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/

#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) }

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

我假设其他情况不会引起警告,因为分配的值是一个常数 0,不会受到缩小的影响。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM