C++ 从_m128转换为_m128i会导致错误的值

C++ 从_m128转换为_m128i会导致错误的值,c++,type-conversion,clang,sse,intrinsics,C++,Type Conversion,Clang,Sse,Intrinsics,我需要将浮点向量(uu m128)转换为整数向量(uu m128i),我正在使用\u mm\u cvtps\u epi32,但我没有得到预期的值。下面是一个非常简单的例子: __m128 test = _mm_set1_ps(4.5f); __m128i test_i = _mm_cvtps_epi32(test); 我得到的调试器输出: (lldb) po test ([0] = 4.5, [1] = 4.5, [2] = 4.5, [3] = 4.5) (lldb) po test_i

我需要将浮点向量(uu m128)转换为整数向量(uu m128i),我正在使用
\u mm\u cvtps\u epi32
,但我没有得到预期的值。下面是一个非常简单的例子:

__m128 test = _mm_set1_ps(4.5f);
__m128i test_i = _mm_cvtps_epi32(test);
我得到的调试器输出:

(lldb) po test
 ([0] = 4.5, [1] = 4.5, [2] = 4.5, [3] = 4.5)
(lldb) po test_i
 ([0] = 17179869188, [1] = 17179869188)
(lldb) 

如您所见,得到的整数是。。17179869188? 从4.5开始?为什么只有两种价值观<代码>\u mm\u cvtps\u epi32应将4个压缩32位浮点值转换为4个压缩32位整数。

在本例中,调试器将
\u m128i
值解释为两个64位整数,而不是您期望的四个32位整数。实际转换是正确的


在代码中,您需要明确指定如何解释SIMD值,例如:
test\u i.m128i\u i32[0]
在本例中,调试器将
\u m128i
值解释为两个64位整数,而不是您期望的四个32位整数。实际转换是正确的


在代码中,您需要明确指定如何解释SIMD值,例如:
test\u i.m128i\u i32[0]
在本例中,调试器将
\u m128i
值解释为两个64位整数,而不是您期望的四个32位整数。实际转换是正确的


在代码中,您需要明确指定如何解释SIMD值,例如:
test\u i.m128i\u i32[0]
在本例中,调试器将
\u m128i
值解释为两个64位整数,而不是您期望的四个32位整数。实际转换是正确的


在代码中,您需要明确指定如何解释SIMD值,例如:
test_i.m128i_i32[0]

提示:
4+4*2^32=17179869188
使用printf调试器<代码>int tmp[4]_mm_storeu_si128((__m128i*)tmp,测试i;printf(“%d%d%d%d\n”,t[0],t[1],t[2],t[3])提示:
4+4*2^32=17179869188
使用printf调试器<代码>int tmp[4]_mm_storeu_si128((__m128i*)tmp,测试i;printf(“%d%d%d%d\n”,t[0],t[1],t[2],t[3])提示:
4+4*2^32=17179869188
使用printf调试器<代码>int tmp[4]_mm_storeu_si128((__m128i*)tmp,测试i;printf(“%d%d%d%d\n”,t[0],t[1],t[2],t[3])提示:
4+4*2^32=17179869188
使用printf调试器<代码>int tmp[4]_mm_storeu_si128((__m128i*)tmp,测试i;printf(“%d%d%d%d\n”,t[0],t[1],t[2],t[3])是的,就是这样。此外,仅强制转换结果也有效:
(int32_t)test_i[0]
。是的,就是这样。此外,仅强制转换结果也有效:
(int32_t)test_i[0]
。是的,就是这样。此外,仅强制转换结果也有效:
(int32_t)test_i[0]
。是的,就是这样。此外,仅强制转换结果也有效:
(int32\u t)test\u i[0]