c++ - 错误: narrowing conversion of ‘18446744069414584320ull’ from ‘long long unsigned int’ to ‘int’ inside { } [-Wnarrowing]

标签 c++

这段代码有什么问题吗?我使用的是 GCC 6.3。

https://ideone.com/ektGEp

a.cpp: In function ‘int main()’:`a.cpp:26:24: error: narrowing conversion of ‘18446744069414584320ull’ from ‘long long unsigned int’ to ‘int’ inside { } [-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 非常特殊,代表 vector 寄存器,这意味着您无法以通常的方式为它们赋值(就像您似乎正在尝试的那样)在你的代码中执行)。您需要使用特殊的加载函数将数据放入寄存器,并使用特殊的存储函数从寄存器取回数据。

以下示例展示了如何将数据(四个 float )加载到 __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/

关于c++ - 错误: narrowing conversion of ‘18446744069414584320ull’ from ‘long long unsigned int’ to ‘int’ inside { } [-Wnarrowing],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55734441/

相关文章:

c++ - 在矩阵中打印唯一行

C++ 为基元调用 allocator.construct

c++ - 无法将项目添加到 const char* vector ? C++

PHP/C++ : Inject values into EXE file

c++ - 用于 C++ 应用程序的较小 Qt 设置的技术

c++ - 当用于多个字符时,单引号在 C++ 中有什么作用?

c++ - clang 没有看到通过 typedef 引入的基类构造函数

c++ - Qt : is good in a c++ class to have a widget field not declared as a pointer

c++ - 如何将像素数组转换为 HBITMAP

c++ - LZ4 解压缩未知大小的二进制内存块