SSE无符号/有符号减法16位寄存器

mar*_*n s 2 c performance sse

我有一个__m128i寄存器(向量A),其内容为16位值:

{100,26,26,26,26,26,26,100} // A Vector
Run Code Online (Sandbox Code Playgroud)

现在我减去矢量

{82,82,82,82,82,82,82,82}
Run Code Online (Sandbox Code Playgroud)

随着指示

_mm_sub_epi16(a_vec,_mm_set1_epi16(82)) 
Run Code Online (Sandbox Code Playgroud)

预期结果应为以下向量

{18,-56,-56,-56,-56,-56,-56,18}
Run Code Online (Sandbox Code Playgroud)

但我明白了

{18,65480,65480,65480,65480,65480,65480,18}
Run Code Online (Sandbox Code Playgroud)

如何解决向量被视为已签名?

A Vector由此指令创建:

__m128i a_vec = _mm_srli_epi16(_mm_unpacklo_epi8(score_vec_8bit, score_vec_8bit), 8)
Run Code Online (Sandbox Code Playgroud)

Pau*_*l R 5

65480是一个相同的值-56(它们都0xffc8在寄存器级别) - 你只是将它显示为无符号短路.

请注意,对于没有进位/借位标志的二进制值的非饱和加法和减法,无论值是有符号还是无符号,这都是无关紧要的 - 因此相同的指令可用于添加有符号和无符号短路 - 唯一的区别在于你如何随后解释(或显示)结果.