Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSE2有符号整数溢出是否未定义? 符号整数溢出在C和C++中是未定义的。但是\uu m128i的各个字段中的有符号整数溢出情况如何?换句话说,这种行为是在英特尔标准中定义的吗 #包括 #包括 #包括 #包括 联盟SSE2 { __m128i m_向量; uint32_t m_dwords[sizeof(u m128i)/sizeof(uint32_t)]; }; int main() { union SSE2 reg={u mm_set_epi32(INT32_MAX,INT32_MAX,INT32_MAX,INT32_MAX)}; reg.m_vector=_mm_add_epi32(reg.m_vector,_mm_set_epi32(1,1,1,1)); printf(“%08”PRIX32”\n“,(uint32_t)reg.m_dwords[0]); 返回0; } [myria@polaris测试]$gcc-m64-msse2-std=c11-O3 SSE2定义。c-o SSE2定义 [myria@polaris测试]$./sse2已定义 80000000_C_Language Lawyer_Undefined Behavior_Sse2 - Fatal编程技术网

SSE2有符号整数溢出是否未定义? 符号整数溢出在C和C++中是未定义的。但是\uu m128i的各个字段中的有符号整数溢出情况如何?换句话说,这种行为是在英特尔标准中定义的吗 #包括 #包括 #包括 #包括 联盟SSE2 { __m128i m_向量; uint32_t m_dwords[sizeof(u m128i)/sizeof(uint32_t)]; }; int main() { union SSE2 reg={u mm_set_epi32(INT32_MAX,INT32_MAX,INT32_MAX,INT32_MAX)}; reg.m_vector=_mm_add_epi32(reg.m_vector,_mm_set_epi32(1,1,1,1)); printf(“%08”PRIX32”\n“,(uint32_t)reg.m_dwords[0]); 返回0; } [myria@polaris测试]$gcc-m64-msse2-std=c11-O3 SSE2定义。c-o SSE2定义 [myria@polaris测试]$./sse2已定义 80000000

SSE2有符号整数溢出是否未定义? 符号整数溢出在C和C++中是未定义的。但是\uu m128i的各个字段中的有符号整数溢出情况如何?换句话说,这种行为是在英特尔标准中定义的吗 #包括 #包括 #包括 #包括 联盟SSE2 { __m128i m_向量; uint32_t m_dwords[sizeof(u m128i)/sizeof(uint32_t)]; }; int main() { union SSE2 reg={u mm_set_epi32(INT32_MAX,INT32_MAX,INT32_MAX,INT32_MAX)}; reg.m_vector=_mm_add_epi32(reg.m_vector,_mm_set_epi32(1,1,1,1)); printf(“%08”PRIX32”\n“,(uint32_t)reg.m_dwords[0]); 返回0; } [myria@polaris测试]$gcc-m64-msse2-std=c11-O3 SSE2定义。c-o SSE2定义 [myria@polaris测试]$./sse2已定义 80000000,c,language-lawyer,undefined-behavior,sse2,C,Language Lawyer,Undefined Behavior,Sse2,请注意,SSE2的4字节大小的字段被认为是有符号的。这个问题有三个方面的错误(不是以一种“你缺乏理解”的方式,而不是以一种“你缺乏理解”的方式……这就是我猜你来这里的原因) 1) 您询问的是具体的实现问题(使用SSE2),而不是标准。您已经回答了自己的问题“有符号整数溢出在C中未定义” 2) 当您处理c内部函数时,您甚至没有使用c编程!这些是在第行插入装配说明。它是以某种可移植的方式进行的,但数据不再是有符号整数。它是传递给SSE内在函数的向量类型。然后将其转换为整数,并告诉C希望看到该操作的结

请注意,SSE2的4字节大小的字段被认为是有符号的。

这个问题有三个方面的错误(不是以一种“你缺乏理解”的方式,而不是以一种“你缺乏理解”的方式……这就是我猜你来这里的原因)

1) 您询问的是具体的实现问题(使用SSE2),而不是标准。您已经回答了自己的问题“有符号整数溢出在C中未定义”

2) 当您处理c内部函数时,您甚至没有使用c编程!这些是在第行插入装配说明。它是以某种可移植的方式进行的,但数据不再是有符号整数。它是传递给SSE内在函数的向量类型。然后将其转换为整数,并告诉C希望看到该操作的结果当您强制转换时出现的任何字节都是您将看到的,与C标准中的有符号算术无关。

3) 只有两个错误的假设。我对错误的数量做了一个假设,结果是错的

如果编译器插入SSE指令(比如在循环中),情况会有所不同。现在编译器保证结果与有符号32位操作相同。。。除非存在未定义的行为(例如溢出),在这种情况下,它可以随心所欲

还要注意,未定义并不意味着意外。。。您观察到的自动矢量化的任何行为都可能是一致的和可重复的(可能它总是包装在您的计算机上……对于周围代码或所有编译器来说,这可能不是所有情况都是如此。或者,如果编译器根据SSSE3、SSE4或AVX*的可用性选择不同的指令,甚至可能不是所有处理器,如果它对不同的指令集做出不同的代码生成选择,而这些指令集可以执行或不执行ke有符号溢出的优点(UB)

编辑:

好的,现在我们问的是“英特尔标准”(不存在,我想你指的是x86标准),我可以在我的回答中添加一些东西。事情有点复杂

首先,为了匹配英特尔的intrinsics API定义(以及英特尔x86汇编手册中的内在注释),他们定义了内在的“mm\u add\u epi32”。他们巧妙地将其定义为对
\uu m128i
执行的操作,与x86
PADDD
指令对XMM寄存器执行的操作相同,无需更多讨论(例如,这是ARM上的编译错误还是应该模拟?)

其次,padd不仅仅是一个有符号加法!它是一个32位二进制加法。x86对有符号整数使用2的补码,将它们相加是与无符号基2相同的二进制操作。因此,是的,
padd
保证会换行。所有x86指令都有很好的参考

那么这意味着什么呢:同样,你问题中的假设是有缺陷的,因为甚至没有任何溢出。因此,你看到的输出应该是由行为定义的。请注意,它是由Microsoft和x86(而不是C标准)定义的

其他x86编译器也以同样的方式实现Intel的intrinsics API,因此
\u mm\u add\u epi32
可移植地保证只进行包装。

这不是“在
\u m128i
的字段中有符号整数溢出”。这是一个函数调用。(作为一个编译器的内在特性只是一种优化,很像内联,只要遵循“仿佛”规则,就不会与C标准交互)


其行为必须遵守合同(先决条件、后决条件)函数开发人员记录的。通常内部函数由编译器供应商记录,尽管他们倾向于协调内部函数的命名和契约,以帮助移植代码。

这是一个非常好的问题!实际上,这些元素的行为与预期一致,即正常的2s补码封装等。我不知道您是否会找到任何东西在英特尔文档中保证这一点。SSE2 <代码>·MI128II/COD>是(显然)一个架构特定的概念,所以C和C++标准不涉及类型或行为或内在性。你需要看看“供应商”。任何高于或超过标准的保证的文档。表9-2将其列为环绕,但我找不到任何明确的保证,
\u mm\u add\u epi32
将永远不会被简单的C包装器模拟。@thatotherguy:我不知道你认为是什么让软件模拟了
\u mm\u add\u epi32()
许可证以给出与
padd
不同的结果。好吧,是的;问题是Intel如何定义标准,以及ICC、GCC、Clang、MSVC等是否遵循Intel标准。这不是一个C标准问题。在这种情况下,您可能需要编辑您的问题:您询问的是x86汇编指令集,以及r SSE溢出已定义。@Myria Intel没有定义任何标准。他们只是根据Intel的SSE4手册定义了CPU的行为:“英特尔C/C++编译器内部等效
PBLENDVB\uuum128i\umm\uBlendv\uEPI8(\uuuum128i v1,\uuuum128i v2,\uuuum128i掩码);
“可移植性:在
\umm…