[英]error: narrowing conversion of ‘199’ from ‘int’ to ‘char’ inside { } [-Wnarrowing]
[英]error: narrowing conversion of ‘18446744069414584320ull’ from ‘long long unsigned int’ to ‘int’ inside { } [-Wnarrowing]
这段代码有什么问题? 我正在使用 GCC 6.3。
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,不会受到缩小的影响。
另一个问题是,为什么__m64
是int
。 我假设__m64
不能直接分配给(作为 MM 寄存器),并且缩小检查(至少对于常量分配)在编译器中是虚假的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.